【问题标题】:How to schedule JMS consuming in Apache Camel?如何在 Apache Camel 中安排 JMS 消费?
【发布时间】:2019-06-03 08:45:55
【问题描述】:

我需要每天晚上 9 点使用 Camel 使用 JMS 消息(或者从晚上 9 点到晚上 10 点,让它有时间使用所有消息)。

当“file://”或“ftp://”URI 存在时,我看不到 URI“cMQConnectionFactory:queue:myQueue”的任何“调度程序”选项。

如果我在它向队列发送空消息之前放置一个 cTimer,而不是调度消费者。

【问题讨论】:

    标签: apache-camel jms scheduling consumer


    【解决方案1】:

    这件事给我带来了很大的麻烦。给这只猫剥皮的方法有很多种,据我所知,没有一种方法很好。

    On 是设置路线不自动开始,并使用时间表启动路线,然后使用 controlbus EIP 在短时间内再次停止。 http://camel.apache.org/controlbus.html

    我不喜欢这种方法,因为我不相信它会完全耗尽队列一次,并且每个触发器只有一次。

    另一种是使用pollEnrich 查询队列,但这似乎只从队列中取出一个项目,但我想完全排空它(仅一次)。

    我编写了一个自定义 bean,它使用消费者和生产者模板来读取队列中具有指定超时的所有条目。

    我在网上某处找到了一个例子,但是我花了很长时间才找到,然后快速搜索我现在找不到它。

    所以我拥有的是:

    from("timer:myTimer...")
      .beanRef( "myConsumerBean", "pollConsumer" )
    
    from("direct:myProcessingRoute")
      .to("whatever");
    

    还有一个简单的pollConsumer 方法:

    public void pollConsumer() throws Exception {
        if ( consumerEndpoint == null ) consumerEndpoint = consumer.getCamelContext().getEndpoint( endpointUri );
        consumer.start();
        producer.start();
        while ( true ) {
            Exchange exchange = consumer.receive( consumerEndpoint, 1000 );
            if ( exchange == null ) break;
            producer.send( exchange );
            consumer.doneUoW( exchange );
        }
        producer.stop();
        consumer.stop();
    }
    

    生产者是DefaultProducerTemplate,消费者是DefaultConsumerTemplate,这些都在bean配置中配置。

    这似乎对我有用,但如果有人给你一个更好的答案,我会非常有兴趣看看如何做得更好。

    【讨论】:

      【解决方案2】:

      您可以使用路由策略,例如设置一个 cron 表达式来判断路由何时启动以及何时停止。

      http://camel.apache.org/scheduledroutepolicy.html

      其他替代方法是通过 Java API 或 JMX 等启动/停止路由,并有一些其他逻辑可以根据时钟知道何时执行此操作。

      【讨论】:

        猜你喜欢
        • 2014-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 2019-10-12
        • 2014-12-30
        相关资源
        最近更新 更多