EJB 3 + JMS和事务

时间:2014-10-06 16:38:39

标签: transactions jms ejb-3.1 tomee

我正在尝试在EBJ中使用JMS(activemq v 5.10),由tomee +(v 1.7)容器管理。 我也想使用JMS Transaction,这就是我遇到麻烦的地方...... 这是我的EJB:

@Singleton
@Remote(value = JmsSender.class)
public class EJBJmsSender implements JmsSender, ExceptionListener {

@Resource
private ConnectionFactory connectionFactory;

private QueueConnection connection;

public void sendMessage(String Queue, String contenuMessage)
        throws ExceptionTechniqueApiJms {

    InitialContext ctx = null;
    Queue queueduService = null;
    Connection queueConn = null;
    try {
        // get the initial context
        ctx = new InitialContext();
        // lookup the queue object
        queueduService = (Queue) ctx.lookup(Queue);
    } catch (NamingException e) {
      ...
    }

    Session queueSession = null;
    try {
        // create a queue connections
        queueConn = connectionFactory.createConnection();
        queueConn.start();
        queueConn.setExceptionListener(this);

        // create a transacted queue session
        queueSession = queueConn.createSession(true,0);

        // create a queue sender
        MessageProducer queueSender = queueSession
                .createProducer(queueduService);
        queueSender.setDeliveryMode(DeliveryMode.PERSISTENT);

        TextMessage message = queueSession
                .createTextMessage(contenuMessage);

        queueSender.send(message);

        queueSession.commit();
    } catch (Exception e) {
        ...
    } finally {

        try {
            if (queueConn != null) {
                queueConn.close();
            }
        } catch (JMSException e) {
            ...
        }
    }

当调用“commit”时,此EJB会导致illegalStateException:

javax.jms.IllegalStateException: Not a transacted session
    at org.apache.activemq.ActiveMQSession.commit(ActiveMQSession.java:569)
    at org.apache.activemq.ra.ManagedSessionProxy.commit(ManagedSessionProxy.java:108)
    ...

如何在EJB中使用JMS“事务会话”?

奇怪的是JMS消息是发送的并且可以被消费......

提前致谢

克莱门特

1 个答案:

答案 0 :(得分:0)

要解决这个问题,我必须将EJB转换为BMT,我的EJB现在看起来像这样:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)

公共类EJBJmsSender实现了JmsSender,ExceptionListener {

您还需要管理交易。为此,您必须在EJB中添加属性:

@Resource
private UserTransaction userTransaction;

然后,您需要根据需要开始/停止交易:

public void sendMessage(String Queue, String contenuMessage)
    throws ExceptionTechniqueApiJms {
try {
        userTransaction.begin(); 
        (...)
        userTransaction.commit(); 
    } catch (Exception e) {
        userTransaction.rollback();
    }
}

有关详细信息,请参阅:http://tomee-openejb.979440.n4.nabble.com/Activemq-embedded-createSession-unable-to-make-it-work-td4672172.html