Apache camel 为什么我的ConsumerTemplate不从ActiveMQ主题读取任何消息?

Apache camel 为什么我的ConsumerTemplate不从ActiveMQ主题读取任何消息?,apache-camel,activemq,Apache Camel,Activemq,我正在尝试使用持久订户端点作为轮询消费者不时地从ActiveMQ主题中使用消息 在我的bean中,我有一个ConsumerTemplate,试图从中接收交换并发送到另一个URI bean方法是: public void pollConsumer() throws Exception { long count = 0; try { if ( consumerEndpoint == null ) consumerEndpoint = consumer.getCamelCont

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

在我的bean中,我有一个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
就我所见,这是正确的(选择器应该在('1','2')中读取
RecordType,子类型='2',
,而不使用URL编码)

我只得到一个“等待消息”日志,没有其他内容,因此似乎没有检索到任何内容

奇怪的是,它也没有在ActiveMQ上注册为持久订阅者,所以看起来它根本没有做任何事情,但它也没有注册任何错误,所以我相当困惑


有人能告诉我为什么这可能不起作用,或者至少我应该从哪里开始查找吗?

如果您的pollConsumer必须等待一秒钟以上才能在队列/主题中找到消息,它将停止

它等待消息1秒,然后返回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路由来完成您描述的任务会更容易。

注意到@pcoates的答案,并尝试延长超时时间以进行测试,很明显问题在于URI上的持久订阅选项没有被执行,并且在1秒的时间内没有关于该主题的新消息t、 什么也没发生

关于持久订阅的回答解释了不能使用来自轮询消费者的持久订阅


因此,我的解决办法是订阅主题并将消息路由到一个新队列,并在这个新队列上拥有轮询消费者。这并不好,因为我不希望有额外的队列,但它可以工作,而且比编写新版本的JMSPollingConsumer省力。

我这样做的原因是,我想安排当我耗尽队列时,您不能以这种方式使用JMS使用者。问题似乎是,我正在创建的端点忽略了
durableSubscriptionName
参数,并创建了一个非持久订阅者,因此在等待的第二秒内找不到任何消息。