2014-10-06 66 views
0

我试图在EBJ内部使用JMS(activemq v 5.10),由tomee +(v 1.7)容器管理。 我也想使用JMS事务,而这也正是我有麻烦...... 这是我的EJB:EJB 3 + JMS和事务

@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) { 
      ... 
     } 
    } 

这个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消息被提前发和可以食用...

感谢

克莱门特

+0

你可以在tomee论坛找到答案:http://tomee-openejb.979440.n4.nabble.com/Activemq-embedded-createSession-unable-to-make-it-work-td4672172.html – 2014-11-25 09:05:20

回答

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