2016-02-09 2 views
0

Я принимаю участие в разработке службы 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(); 
     } 
    } 
} 

Заранее спасибо.

ответ

0

Самый легкий вес будет NOT_SUPPORTED, поэтому нет накладных расходов на транзакцию, но предполагает, что отправка ответа всегда будет успешной, и нет необходимости откатывать эту транзакцию. Если есть условия ошибки, которые могут потребовать отменить ответ и, я думаю, отправить другой ответ, тогда могут потребоваться транзакции. Тем не менее, я надеюсь, что вся обработка будет выполнена до того, как вы отправите ответ, а затем завершите/отмените переопределяющую транзакцию впоследствии.

+0

Спасибо Скотту. Я делаю всю обработку перед отправкой ответа назад, поэтому лучшим вариантом для меня является то, что TransactionalAttribute будет NOT_SUPPORTED ... – Jegajeeth

Смежные вопросы