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