如何解决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 输出:
杀死它。
Consumer2 输出:
解决方法
经过痛苦的测试,愚蠢的错误。我正在从客户端进程传递 3
,它是 SESSION_TRANSACTED
not INDIVIDUAL_ACKNOWLEDGE
。我正在使用 NetBeans,其中自动完成显示以下内容(可能是字母顺序)。这导致我通过 3
而不是 4
。
Session.h
清楚地显示:
enum AcknowledgeMode {
AUTO_ACKNOWLEDGE,DUPS_OK_ACKNOWLEDGE,CLIENT_ACKNOWLEDGE,SESSION_TRANSACTED,INDIVIDUAL_ACKNOWLEDGE
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。