Я принимаю участие в разработке службы JMS Request Response с использованием EJB. Служба получает сообщения JMS в виде запроса через MDB и отвечает на сообщение JMS (используя ReplyToQ, настроенный в запросе).Транзакция при отправке ответа JMS
Требование состоит в том, что даже в случае возникновения ошибки в сервисе ответ должен быть отправлен обратно. Если ответ отправляется в методе onMessage(), он отправляется в рамках той же транзакции, где запрос обрабатывается или принимается. В этом случае, когда происходит ошибка, транзакция откатывается назад и, следовательно, ответ не отправляется.
Итак, я переместил часть кода, который отправляет ответ, методу в другом сеансе сеанса без состояния с TransactionAttribute.REQUIRES_NEW. Код работает сейчас.
Но я немного смущен относительно того, следует ли иметь метод отправки ответа в новой транзакции с использованием 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();
}
}
}
Заранее спасибо.
Спасибо Скотту. Я делаю всю обработку перед отправкой ответа назад, поэтому лучшим вариантом для меня является то, что TransactionalAttribute будет NOT_SUPPORTED ... – Jegajeeth