发送 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 压倒一切的事务。