我目前正在使用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();
}
}
}
先谢谢。
答案 0 :(得分:0)
最轻的权重将是NOT_SUPPORTED,因此没有事务开销,但假设响应发送总是成功,并且不需要回滚该事务。如果存在可能需要回复响应的错误条件,并且我想,发送不同的响应,则可能需要进行事务处理。但是,我希望在发送响应之前完成所有处理,然后在之后提交/回滚覆盖事务。