为什么我的ConsumerTemplate无法读取ActiveMQ主题中的任何消息?

时间:2018-11-28 15:53:08

标签: apache-camel activemq

我正在尝试使用持久的订户端点,不时地从ActiveMQ主题中将消息作为轮询消费者使用。

在我的bean中,我有一个ConsumerTemplate,我正试图从该ConsumerTemplate接收交换并发送到另一个URI。

bean方法是:

public void pollConsumer() throws Exception {
    long count = 0;
    try {
    if ( consumerEndpoint == null ) consumerEndpoint = consumer.getCamelContext().getEndpoint( endpointUri );
    logger.debug( "Consuming: " + consumerEndpoint.getEndpointUri() );
    consumer.start();
    producer.start();
    while ( true ) {
        logger.trace("Awaiting message: " + ++count );
        Exchange exchange = consumer.receive( consumerEndpoint, 1000 );
        if ( exchange == null ) break;
        logger.trace("Processing message: " + count );
        producer.send( exchange );
        consumer.doneUoW( exchange );
        logger.trace("Processed message: " + count );
    }
    producer.stop();
    consumer.stop();
    } catch ( Throwable t ) {
        logger.error("Something went wrong!", t );
        throw t;
    }
}

调用时,记录器以以下形式显示“正在使用”消息

activemq://topic:fromQueue.Name?clientId=MyClient&durableSubscriptionName=MyClient&selector=RecordType+IN+%28+%271%27%2C+%272%27+%29+AND+SubType+%3D+%272%27

据我所知,这是正确的(选择器应在不使用URL编码的情况下读取RecordType IN ('1', '2') AND SubType = '2'

我得到一个“等待消息”日志,什么也没有,所以似乎什么也没找回。

Bizarrely,它也没有在ActiveMQ上注册为持久订阅者,因此看来它根本没有做任何事情,但是它也没有注册任何错误,所以我很困惑。

谁能建议为什么这可能行不通,或者至少在我应该开始寻找的地方?

2 个答案:

答案 0 :(得分:1)

如果您的pollConsumer必须等待一秒钟以上,则消息将停止在队列/主题上。

它等待一秒钟的消息,此后它返回null并将退出while循环并停止使用者。

    Exchange exchange = consumer.receive( consumerEndpoint, 1000 );
==> if ( exchange == null ) break;
    logger.trace("Processing message: " + count );
    producer.send( exchange );
    consumer.doneUoW( exchange );

使用apache-camel路线来完成您描述的操作会更容易。

答案 1 :(得分:0)

注意到@pcoates答案,并尝试延长超时以进行测试,结果很明显,问题是未对URI上的持久订阅选项起作用,并且因为该主题上没有新消息在等待1秒的过程中,没有任何反应。

another question的与持久订阅有关的答案说明,您不能使用轮询使用者的持久订阅。

因此,我的解决方法是订阅主题并将消息路由到新队列,并使轮询使用者位于该新队列上。这不是很好,因为我不想再有一个额外的队列,但是与编写新版本的JMSPollingConsumer相比,它可以工作并且花费更少的精力。

相关问题