我正在尝试在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消息是发送的并且可以被消费......
提前致谢
克莱门特
答案 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();
}
}