【问题标题】:EJB 3 + JMS and transactionEJB 3 + JMS 和事务
【发布时间】:2014-10-06 16:38:39
【问题描述】:

我正在尝试在由 tomee+ (v 1.7) 容器管理的 EBJ 中使用 JMS (activemq v 5.10)。 我也想使用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 会导致非法状态异常:

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消息是发送的,可以消费的……

提前致谢

克莱门特

【问题讨论】:

标签: transactions jms ejb-3.1 apache-tomee


【解决方案1】:

为了解决这个问题,我必须将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-06
    • 2013-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2011-03-24
    • 1970-01-01
    相关资源
    最近更新 更多