当前位置: 首页 > 知识库问答 >
问题:

阿帕奇骆驼:分路器,CBR还是动态路由器?

邬宏扬
2023-03-14

我有以下的POJO:

public class MyPOJO {
    private Fizz fizz;
    private Buzz buzz;

    // ctor, getters, setters, etc.
}

和下面的路线(Spring XML):

<route id="myroute">
    <from uri="timer://runOnce?repeatCount=1&amp;delay=10" />

    <to uri="bean:myPOJOFactory?method=newMyPOJO" />

    <!-- Not sure what to do here -->
    <!-- MyPOJO#Fizz should get routed to direct:fizzFarm. -->
    <!-- MyPOJO#Buzz should get routed to direct:buzzFarm. -->
</route>

其中myPOJOFactory是:

public class MyPOJOFactory {
    public MyPOJO newMyPOJO(Exchange exchange) {
        Fizz fizz = new Fizz(true, 3);
        Buzz buzz = new Buzz("awesome");

        MyPOJO pojo = new MyPOJO(fizz, buzz);

        exchange.getOut().setBody(pojo);
    }
}

我现在需要一种方法将 MyPOJO 实例(在 myPOJOFactory Bean 中创建)拆分为其组成 FizzBuzz 属性,并以一种方式路由 Fizz,以另一种方式路由 Buzz

我对拆分器的理解是,它只是将交换的主体分解为2个对象的集合。但我不认为这是我想要的,因为尽管我确实希望MyPOJO被“拆分”成其组成部分FizzBuzz字段,但我希望将它们路由到不同的目的地。也许菲兹导演:嘶嘶声农场嗡嗡去直接:嗡嗡声农场

我对基于内容的路由器的理解(

我对动态路由器的理解是,它会动态地将消息路由到不同的目的地,尽管我还不太确定是如何做到的。我相信这就是我想要的,但是,从< code>myPOJOFactory bean中出来,交换将包含一个< code>MyPOJO对象。我觉得在将< code>MyPOJO发送到动态路由器之前,我必须先将其拆分。这样,动态路由器将能够清楚地看到消息是< code>Fizz还是< code>Buzz,并正确地路由它。

因此,我认为我需要将分离器与动态路由器结合使用。我只是没有透过树看到森林。大概是这样的:

<route id="myroute">
    <from uri="timer://runOnce?repeatCount=1&amp;delay=10" />

    <to uri="bean:myPOJOFactory?method=newMyPOJO" />

    <split>
        <tokenize token="Somehow split MyPOJO into Fizz and Buzz here" />
        <to uri="direct:dynrouter" />
    </split>

    <from uri="direct:dynrouter" />

    <dynamicRouter>
        <!-- ??? Somehow route Fizz to direct:fizzFarm, and Buzz to direct:buzzFarm
    </dynamicRouter>
</route>

关于我如何实现这一点,有什么想法吗(#1将MyPOJO拆分FizzBuzz,以及#2设置路由器将FizzBuzz路由到不同的目的地)?

共有1个答案

吕胤
2023-03-14

你说得对,因为逻辑总是一样的,路由器可能会过度使用。

拆分器最常用于相同类型的对象(例如,拆分列表并分别处理每个项目)

所以我可以建议多播EIP吗?应该可以这样做:

from("timer://runOnce?repeatCount=1&delay=10")
    .bean(myPOJOFactory.class)
    .multicast().to("direct:sendFizz", "direct:sendBuzz")

from("direct:sendFizz")
    .setBody(simple("${body.fizz"))
    .to("direct:fizzFarm")

from("direct:sendBuzz")
    .setBody(simple("${body.buzz"))
    .to("direct:buzzFarm")

(这明显是DSL语法,也可以用XML试试)。

 类似资料:
  • 我使用Camel JPAendpoint来轮询数据库,并将数据复制到第二个数据库。为了不重复轮询,我打算保存复制数据的最高ID,并且只轮询ID高于该ID的数据。 为了节省一些数据库写入,我希望在当前轮询/复制运行结束后写回最高ID,而不是针对每个数据元素。我可以访问骆驼路线类中的元素(及其ID): 现在我想在当前轮询结束后保存。为此,我用自己的自定义方法重写了,在这里我想访问方法中的(在当前轮询完

  • 下面是我试图实现的场景: 谢谢你的帮助。此外,这里是已经工作的FTP部分。

  • 我有一个spring boot应用程序,我正在向其中添加一个camel路由。定义路由的类扩展了FatJarRouter,并用@component注释。当应用程序作为spring boot应用程序运行时,不会识别路由。但是,如果我在主类中使用@SpringBootApplication注释编写路由,则会标识路由。这是它目前在日志中的显示方式: 请告诉我如何在将路由作为一个单独的类而不是在主类中编写时

  • 我有一个Camel route,它使用队列中的消息并将消息存储到数据库中。现在,我想以一种优雅的方式手动关闭运行骆驼路线。我有一个RestEndpoint,每当我需要停止Camel route时就会被触发。此endpoint应停止路由。但是,如果在关闭期间有任何正在运行的消息或事务,则必须在不消耗来自camel route的("")endpoint的任何新消息的情况下成功完成,并在完成正在运行的消

  • 我试图使用Apache Camel Quartz2实现一个调度器,它每分钟执行一次路由,并按预期执行一些任务。我使用spring DSL实现与apache camel相关联的路由,如下所示: 根据日志,它不会记录为路由记录的消息,例如Direct:DomainsWithFTPUsers等等。请指导如何实现同样的目标。

  • 遵循官方文件(https://camel.apache.org/manual/component-dsl.html#_using_component_dsl)我创建了以下代码: 但是中的告诉我: 并且中的特性不建议导入相应的库。 有人能给我指出正确的方向吗? 我必须理解的概念才能做到这一点吗?