URI ActiveMQ-cpp Broker с PrefetchPolicy не имеет никакого эффекта

Я использую 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()?

0

Решение

Это не работает таким образом. При использовании асинхронных потребителей сообщения доставляются так быстро, как завершается метод onMessage. Если вы хотите использовать одно и только одно сообщение, используйте синхронизированный приемный вызов.

Для асинхронного потребителя предварительная выборка позволяет брокеру буферизовать работу на клиенте вместо того, чтобы запускать по одному, чтобы вы могли в целом получить лучшую производительность, в вашем случае, когда вызов async onMessage завершается, ack отправляется обратно брокеру и следующее сообщение отправляется клиенту.

0

Другие решения

Да, я тоже нахожу это. Тем не менее, когда я использую опцию 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.

Спасибо!

0