我正在尝试使用持久的订户端点,不时地从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上注册为持久订阅者,因此看来它根本没有做任何事情,但是它也没有注册任何错误,所以我很困惑。
谁能建议为什么这可能行不通,或者至少在我应该开始寻找的地方?
答案 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相比,它可以工作并且花费更少的精力。