微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AMQ INDIVIDUAL_ACKNOWLEDGE 模式

如何解决AMQ INDIVIDUAL_ACKNOWLEDGE 模式

我正在使用 INDIVIDUAL_ACKNowLEDGE 模式接收消息,并使用 C++ CMS 库手动确认从 AMQ 接收的消息,该库通过 Openwire 协议实现 JMS 标准。 我有两个消费者(消费者 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 输出

enter image description here

杀死它。

Consumer2 输出

enter image description here

解决方法

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

NetBeansAutoComplete

CMS 中的

Session.h 清楚地显示:

        enum AcknowledgeMode {

            AUTO_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE,CLIENT_ACKNOWLEDGE,SESSION_TRANSACTED,INDIVIDUAL_ACKNOWLEDGE

        };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。