我试图从简单的无状态EJB发送/生成JMS消息。为此,我使用CDI生成并注入JMS资源(ConnectionFactory
,Connection
和Session
)。完全按照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方法都是事务处理的,对吧?
答案 0 :(得分:0)
我在JBoss Forum thread中找到了答案。
总而言之,如果您想要一个事务处理的JMS会话,您必须自己控制(提交/回滚)tx或使用JMS XAConnectionFactory
。在我的情况下,我使用的是默认的InVM
ConnectionFactory,它不是XA。因此,在这种情况下,即使使用EJB,我也必须明确地调用session.commit()
。或者将我的ConnectionFactory资源更改为XA。