【问题标题】:How to start one route to another with interval time in Apache Camel如何在 Apache Camel 中以间隔时间开始一条到另一条的路线
【发布时间】:2020-10-30 21:33:08
【问题描述】:

我想从route1调用route2,它应该执行间隔时间,我创建了下面的代码,它是正确的代码,写了多个from方法,有人能给我建议吗?

//Route1
  from("timer:repeatcount=1").
    .to("direct:route2 ");
//Route2    
    from("direct:route2").
    from("timer://simpleTimer?period=1000")
    .setBody(simple("Hello from timer at ${header.firedTime}"))
    .to("stream:out");

【问题讨论】:

    标签: apache-camel spring-camel


    【解决方案1】:

    您将在下面找到一个完整的 Camel 3(版本 3.4.3)示例,如何使用Timer 组件触发路由(TimerRoute)以及如何调用另一条路由(SaveFileRoute)。该示例使用 Camel Main 模块实现。

    路由使用From EIP 消费来自endpoints 的消息,这些消息由TimerDirect 组件和To EIP 生成(或“发送”)消息给消费者。

    首先 Timer 组件用于自动生成路由调用。这是消息流的起点:

    from("timer:exampleTimer?fixedRate=true&period=3s")
    

    在第一个路由结束时,消息被转发到第二个路由:

    .to("direct:savefile")
    

    下一步发生在消费消息的第二条路由中:

    from("direct:savefile")
    

    因为第二条路由不会将消息转发到消息流结束的任何地方。

    注意在字符串"direct:savefile":

    • direct 是生成端点的组件类型
    • saveFile 是唯一标识端点的名称

    完整的例子:

    // https://camel.apache.org/components/latest/others/main.html
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.main.Main;
    
    public class App {
        public static void main(String[] args) throws Exception {
            Main main = new Main();
            main.configure().addRoutesBuilder(
                new RouteBuilder() {
                    public void configure() {
                        from("direct:savefile")
                        .routeId("SaveFileRoute")
                        .log("ROUTE START: body = ${body}")
                        // just logging here
                        // .to("file://outbox")
                        .log("ROUTE END:")
                        ;
                    }
                }
            );
            main.configure().addRoutesBuilder(
                new RouteBuilder() {
                    public void configure() {
                        // triggers on every 3 seconds
                        // https://camel.apache.org/components/latest/timer-component.html
                        from("timer:exampleTimer?fixedRate=true&period=3s")
                        .routeId("TimerRoute")
                        .log("ROUTE START:")
                        // https://camel.apache.org/components/latest/eips/setBody-eip.html
                        .setBody(constant("HELLO FROM TIMER!"))
                        .to("direct:savefile")
                        .log("ROUTE END:")
                        ;
                    }
                }
            );
            main.run(args);
        }
    }
    

    示例运行:

    $ mvn compile exec:java
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] -----------------------< net.jani-hur:004-timer >-----------------------
    [INFO] Building 004-timer 1.0
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ 003-timer ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] Copying 1 resource
    [INFO] 
    [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ 003-timer ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] 
    [INFO] --- exec-maven-plugin:3.0.0:java (default-cli) @ 004-timer ---
    [                    App.main()] BaseMainSupport                INFO  Using properties from: classpath:application.properties;optional=true
    [                    App.main()] DefaultRoutesCollector         INFO  No additional Camel XML routes discovered from: classpath:camel/*.xml
    [                    App.main()] DefaultRoutesCollector         INFO  No additional Camel XML rests discovered from: classpath:camel-rest/*.xml
    [                    App.main()] AbstractCamelContext           INFO  Apache Camel 3.4.3 (camel-1) is starting
    [                    App.main()] AbstractCamelContext           INFO  StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
    [                    App.main()] InternalRouteStartupManager    INFO  Route: SaveFileRoute started and consuming from: direct://savefile
    [                    App.main()] InternalRouteStartupManager    INFO  Route: TimerRoute started and consuming from: timer://exampleTimer
    [                    App.main()] AbstractCamelContext           INFO  Total 2 routes, of which 2 are started
    [                    App.main()] AbstractCamelContext           INFO  Apache Camel 3.4.3 (camel-1) started in 0.031 seconds
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE START:
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE START: body = HELLO FROM TIMER!
    [read #0 - timer://exampleTimer] SaveFileRoute                  INFO  ROUTE END:
    [read #0 - timer://exampleTimer] TimerRoute                     INFO  ROUTE END:
    ^C$
    

    【讨论】:

    • 谢谢你的回复,这里你是怎么从route1调用route2的,在你的例子中,route1和route2有什么关系,你能回复一下吗?
    • @sreekanthjanapati 我已经更新了答案,为您提供更多指导。不幸的是,您的问题表明您对基本的骆驼概念没有很好的理解。如果您不了解 EIP、组件、端点和交换等概念,您将永远无法理解 Camel 代码。幸运的是,互联网上有很多介绍基本知识的介绍!不幸的是camel.apache.org/manual/latest 不是最好的:(
    • @sreekanthjanapati 例如tomd.xyz/camel-routes 似乎是骆驼路线的一个很好的介绍。
    • 谢谢你的时间,我的错,我可能无法向你解释这个问题,我的主要意图是,我必须调用保存文件路由器(route2 应该调用每个间隔) TimerRoute(route1)应该只调用一次, 你的例子正好相反
    猜你喜欢
    • 2016-06-04
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多