Я использую activemq-cpp 3.7.0 с VS 2010 для сборки клиента, сервер ActiveMQ 5.8. Я создал приемник сообщений, используя код, подобный следующему, на основе упомянутых конфигураций CMS Вот. ConnClass
это ExceptionListener
и MessageListener
, Я хочу использовать только одно сообщение перед звонком cms::Session::commit()
,
void ConnClass::setup()
{
// Create a ConnectionFactory
std::tr1::shared_ptr<ConnectionFactory> connectionFactory(
ConnectionFactory::createCMSConnectionFactory(
"tcp://localhost:61616?cms.PrefetchPolicy.queuePrefetch=1");
// Create a Connection
m_connection = std::tr1::shared_ptr<cms::Connection>(
connectionFactory->createConnection());
m_connection->start();
m_connection->setExceptionListener(this);
// Create a Session
m_session = std::tr1::shared_ptr<cms::Session>(
m_connection->createSession(Session::SESSION_TRANSACTED));// Create the destination (Queue)
m_destination = std::tr1::shared_ptr<cms::Destination>(
m_session->createQueue("myqueue?consumer.prefetchSize=1"));
// Create a MessageConsumer from the Session to the Queue
m_consumer = std::tr1::shared_ptr<cms::MessageConsumer>(
m_session->createConsumer( m_destination.get() ));
m_consumer->setMessageListener( this );
}
void ConnClass::onMessage( const Message* message )
{
// read message code ...
// schedule a processing event for
// another thread that calls m_session->commit() when done
}
Проблема в том, что я получаю несколько сообщений вместо одного сообщения перед звонком m_session->commit()
— Я знаю это, потому что commit()
вызов инициируется пользовательским вводом. Как я могу обеспечить onMessage()
вызывается только один раз перед каждым вызовом commit()
?
Это не работает таким образом. При использовании асинхронных потребителей сообщения доставляются так быстро, как завершается метод onMessage. Если вы хотите использовать одно и только одно сообщение, используйте синхронизированный приемный вызов.
Для асинхронного потребителя предварительная выборка позволяет брокеру буферизовать работу на клиенте вместо того, чтобы запускать по одному, чтобы вы могли в целом получить лучшую производительность, в вашем случае, когда вызов async onMessage завершается, ack отправляется обратно брокеру и следующее сообщение отправляется клиенту.
Да, я тоже нахожу это. Тем не менее, когда я использую опцию Destination URI («consumer.prefetchSize = 15», http://activemq.apache.org/cms/configuring.html#Configuring-DestinationURIParameters ) для асинхронного потребителя, это работает хорошо.
Кстати, я просто использую последнюю версию ActiveMQ-CPP v3.9.4 от Tim и ActiveMQ v5.12.1 для CentOS 7.
Спасибо!