我使用activemq-cpp 3.7.0和VS 2010构建客户端,服务器是ActiveMQ 5.8。我根据提到的here的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 :(得分:0)
它不起作用。使用异步使用者时,消息的传递速度与onMessage方法完成时一样快。如果您只想使用一条消息,请使用同步接收呼叫。
对于异步使用者,预取允许代理缓冲客户端上的工作,而不是一次触发一个,这样您通常可以获得更好的性能,在您的情况下,当async onMessage调用完成时,ack被发送回代理将下一条消息发送给客户端。
答案 1 :(得分:0)
是的,我也发现了这一点。但是,当我对异步使用者使用目标URI选项(&#34; consumer.prefetchSize = 15&#34;,http://activemq.apache.org/cms/configuring.html#Configuring-DestinationURIParameters)时,它运行良好。
BTW,我只使用Tim的最新ActiveMQ-CPP v3.9.4和CentOS 7上的ActiveMQ v5.12.1。
谢谢!