CDI结束JMS端点:@Produces交易会话问题

时间:2015-11-30 12:15:54

标签: java-ee jms cdi

我试图从简单的无状态EJB发送/生成JMS消息。为此,我使用CDI生成并注入JMS资源(ConnectionFactoryConnectionSession)。完全按照Weld doc - JavaEE integration, JMS enpoints

中的描述

关键是如果我将JMS会话生成为trasacted,则我的EJB不会发送(或提交)消息。没有错误发生。

CDI资源制作人:

@Produces
@ItemQualifier
public Session createJMSSession(@ItemQualifier Connection connection) throws JMSException {
    return connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
}

EJB JMS生产者方法:

public void pushItem(Item newItem) throws Exception {
    log.info("Sending " + newItem.getDescricao());
    log.info("Session Transacted? " + mineracaoSession.getTransacted());

    ObjectMessage message = session.createObjectMessage();

    message.setObject(newItem);
    producer.send(message);

    log.info("Message sent!");
}

如果我更改Producer方法以创建非事务JMS会话,则会正常发送(提交)消息。

我想了解为什么我的EJB在JMS会话为transacted时不发送/提交消息。默认情况下,所有EJB方法都是事务处理的,对吧?

1 个答案:

答案 0 :(得分:0)

我在JBoss Forum thread中找到了答案。

总而言之,如果您想要一个事务处理的JMS会话,您必须自己控制(提交/回滚)tx或使用JMS XAConnectionFactory。在我的情况下,我使用的是默认的InVM ConnectionFactory,它不是XA。因此,在这种情况下,即使使用EJB,我也必须明确地调用session.commit()。或者将我的ConnectionFactory资源更改为XA。