发送JMS响应时的事务性

时间:2016-02-09 19:22:10

标签: java ejb jms

我目前正在使用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();
        }
    }
}

先谢谢。

1 个答案:

答案 0 :(得分:0)

最轻的权重将是NOT_SUPPORTED,因此没有事务开销,但假设响应发送总是成功,并且不需要回滚该事务。如果存在可能需要回复响应的错误条件,并且我想,发送不同的响应,则可能需要进行事务处理。但是,我希望在发送响应之前完成所有处理,然后在之后提交/回滚覆盖事务。