问题描述
我正在使用 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 输出: