具有PrefetchPolicy的ActiveMQ-cpp Broker URI无效

时间:2013-07-19 16:02:05

标签: c++ activemq prefetch activemq-cpp

我使用activemq-cpp 3.7.0和VS 2010构建客户端,服务器是ActiveMQ 5.8。我根据提到的here的CMS配置,使用类似于以下的代码创建了消息使用者。 ConnClassExceptionListenerMessageListener。我只想在调用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()之前调用一次?

2 个答案:

答案 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。

谢谢!