发送 JMS 响应时的事务性
Transactionality while Sending JMS Response
我目前正在使用 EJB 开发 JMS 请求响应服务。该服务通过 MDB 接收 JMS 消息作为请求,并使用 JMS 消息进行响应(使用请求中配置的 ReplyToQ)。
要求是即使在服务发生错误的情况下,也应该发回响应。如果响应是在 onMessage() 方法中发送的,那么它是在处理或接收请求的同一事务中发送的。在这种情况下,当发生错误时,事务会回滚,因此不会发送响应。
因此,我已将发送响应的代码部分移动到一个方法,在另一个具有 TransactionAttribute.REQUIRES_NEW 的无状态会话 bean 中。代码现在可以工作了..
但是我有点困惑是使用 TransactionAttribute.REQUIRES_NEW 还是将其作为 TransactionAttribute.NOT_SUPPORTED 在新事务中使用响应发送方法。你能告诉我哪个更好吗..使用 TransactionAttribute.REQUIRES_NEW 或使用 TransactionAttribute.NOT_SUPPORTED 方法。
我提供了以下代码的摘录
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void sendResponse(Message inMessage, Object responseObj)
throws JMSException {
Connection jmsConnection = null;
Session jmsSession = null;
try {
jmsConnection = getConnection();
Destination jmsDestination = inMessage.getJMSReplyTo();
jmsSession = jmsConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
String marshalTxt = "Sample Response";
Message responseMessage = jmsSession.createTextMessage(marshalTxt);
responseMessage.setJMSCorrelationID(getCorrelId());
jmsSession.createProducer(jmsDestination).send(responseMessage);
} catch (JMSException | IllegalStateException exception) {
LOGGER.error("void sendResponse ->Unable to send the response",
exception);
throw exception;
}finally{
if(jmsConnection != null){
jmsConnection.close();
}
}
}
提前致谢。
最轻的权重将是 NOT_SUPPORTED,因此没有事务开销,但假设响应发送总是会成功并且不需要回滚该事务。如果存在可能需要撤回响应的错误情况,并且我猜想发送不同的响应,那么可能需要事务处理。但是,我希望在您发送响应之前完成所有处理,然后 commit/rollback 压倒一切的事务。
我目前正在使用 EJB 开发 JMS 请求响应服务。该服务通过 MDB 接收 JMS 消息作为请求,并使用 JMS 消息进行响应(使用请求中配置的 ReplyToQ)。
要求是即使在服务发生错误的情况下,也应该发回响应。如果响应是在 onMessage() 方法中发送的,那么它是在处理或接收请求的同一事务中发送的。在这种情况下,当发生错误时,事务会回滚,因此不会发送响应。
因此,我已将发送响应的代码部分移动到一个方法,在另一个具有 TransactionAttribute.REQUIRES_NEW 的无状态会话 bean 中。代码现在可以工作了..
但是我有点困惑是使用 TransactionAttribute.REQUIRES_NEW 还是将其作为 TransactionAttribute.NOT_SUPPORTED 在新事务中使用响应发送方法。你能告诉我哪个更好吗..使用 TransactionAttribute.REQUIRES_NEW 或使用 TransactionAttribute.NOT_SUPPORTED 方法。
我提供了以下代码的摘录
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void sendResponse(Message inMessage, Object responseObj)
throws JMSException {
Connection jmsConnection = null;
Session jmsSession = null;
try {
jmsConnection = getConnection();
Destination jmsDestination = inMessage.getJMSReplyTo();
jmsSession = jmsConnection.createSession(false,
Session.AUTO_ACKNOWLEDGE);
String marshalTxt = "Sample Response";
Message responseMessage = jmsSession.createTextMessage(marshalTxt);
responseMessage.setJMSCorrelationID(getCorrelId());
jmsSession.createProducer(jmsDestination).send(responseMessage);
} catch (JMSException | IllegalStateException exception) {
LOGGER.error("void sendResponse ->Unable to send the response",
exception);
throw exception;
}finally{
if(jmsConnection != null){
jmsConnection.close();
}
}
}
提前致谢。
最轻的权重将是 NOT_SUPPORTED,因此没有事务开销,但假设响应发送总是会成功并且不需要回滚该事务。如果存在可能需要撤回响应的错误情况,并且我猜想发送不同的响应,那么可能需要事务处理。但是,我希望在您发送响应之前完成所有处理,然后 commit/rollback 压倒一切的事务。