0

我正在使用 INDIVIDUAL_ACKNOWLEDGE 模式接收消息并使用通过 Openwire 协议实现 JMS 标准的 C++ CMS 库手动确认从 AMQ 接收到的消息。我有两个消费者(消费者 1,消费者 2)从同一个队列接收。当 Consumer1 收到消息时,Consumer 确认消息。当我杀死消费者 1 时,消费者 2 会收到消息。我没想到 Consumer2 会收到它,因为它已经被确认了。看起来我对 acknowledge() 的调用被忽略了。

任何线索或指示都会有所帮助。尝试连接到 ActiveMQ 5.12.1 或 Red Hat AMQ 7.2.1,同样的行为表明问题不在于 Messaging Broker 而是我这边。我对 acknowledge() 的调用被忽略了。

很高兴提供更多信息。

这是消息接收器调用:

定义:

        cms::Message* _textMessage;

留言电话:

MQMessage* AMQQueueInputService::getMessageConsumerReceiveSingle(long timeout)
{
        try
        {
                _textMessage = _receiverRef->receive(timeout);

                const cms::TextMessage* textMessage = dynamic_cast< const cms::TextMessage* > (_textMessage);

                if (_textMessage == NULL)
                        return NULL;

                MQMessage* mqMessage = new MQMessage(textMessage->getText(), getMessageProperties( textMessage ));

                return mqMessage;
        }
        catch (cms::CMSException& e)
        {
                throw (e);
        }
}

确认呼叫:

bool AMQService::processMsgAck(Poco::Logger& logger)
{
        try
        {
                if (_textMessage != NULL)
                {
                        poco_information( logger,   format( " AMQService: Acknowledged CMSMessageId [%s]", _textMessage->getCMSMessageID() ) );
                        _textMessage->acknowledge(); //_sessionRef->getAcknowledgeMode() != cms::Session::AcknowledgeMode::AUTO_ACKNOWLEDGE

                        delete _textMessage;
                        _textMessage = NULL;

                        return true;

                }
        }
        catch (cms::CMSException& e)
        {
                e.printStackTrace();
                throw (e);
        }

}

消费者 1 输出:

在此处输入图像描述

杀了它。

消费者2输出:

在此处输入图像描述

4

1 回答 1

0

经过痛苦的测试,愚蠢的错误。我是从不是3的客户端进程传递过来的。我正在使用 NetBeans,其中自动完成显示以下内容(可能是字母顺序)。这导致我通过而不是.SESSION_TRANSACTED INDIVIDUAL_ACKNOWLEDGE34

NetBeans 自动完成

Session.h在 CMS 中清楚地显示:

        enum AcknowledgeMode {

            AUTO_ACKNOWLEDGE,
            DUPS_OK_ACKNOWLEDGE,
            CLIENT_ACKNOWLEDGE,
            SESSION_TRANSACTED,
            INDIVIDUAL_ACKNOWLEDGE

        };
于 2021-05-19T13:55:08.673 回答