ActiveMQ - 事务会话不提交所有消息

时间:2018-03-13 11:18:49

标签: activemq

我正在使用ActiveMQ来实现JMS系统。 我的第一个场景使用NOT事务处理会话正常工作,如下所示:

connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);

之后,我需要一个重新发送系统,因此我已经读过,使用事务会话(http://activemq.apache.org/message-redelivery-and-dlq-handling.html)默认情况下重新发送选项有效,所以我更改了我的代码:

connection.createQueueSession(true, ActiveMQSession.SESSION_TRANSACTED);

我已经更改了send和onMessage方法。 两种方法共享相同的会话,因此方法如下:

SendMethod:

public static ObjectMessage createObjectMessageAndSendIt(Serializable toSend) throws JMSException {
    ObjectMessage message = session.createObjectMessage();
    message.setObject(toSend);
    sender.send(message);
    commitSession();
    return message;
}

OnMessage方法:

public void onMessage(Message m) {
    LOG.debug("IN onMessage message with ID [" + m.getJMSMessageID() + "]");
    try {
        if (m != null) {
            if (m instanceof ObjectMessage) {
                // do something
                m.acknowledge();
                JMSUtils.commitSession();
            }
        }
    } catch (Exception e) {
        // Rollback session because this message must be redelivered, it will be sent to DLQ
        JMSUtils.rollbackSession();
    }

    LOG.debug("OUT onMessage message with ID [" + m.getJMSMessageID() + "]");
}

当我发送单个消息时,一切正常,但是当我开始大量发送消息时,尽管正确详细说明,但仍有一些消息留在队列中。这种情况导致,在服务器的新启动时,将再次详细说明此消息(我使用持久性进入KahaDB)。

你能告诉我为什么会出现这种奇怪的情况吗? 谢谢

1 个答案:

答案 0 :(得分:0)

使用相同的发件人和消费者会话的接缝会产生我的问题。 实际上,现在我尝试使用单独的会话

  • 发送后我提交发件人会话
  • 消费者中的
  • 我提交或回滚consumerSession

并且所有工作都是例外。

如果我做错了或您有其他建议请回复我。