【问题标题】:Camel CBRs and POJO property inspectionCamel CBR 和 POJO 财产检查
【发布时间】:2013-01-09 09:42:22
【问题描述】:

我有一条 Camel 路由正在路由 Order 实例:

from("direct:start")
    .choice()
        .when(order.getProduct() == Product.Widget)
            .to("direct:widgets")
        .when(order.getProduct() == Product.Fizz)
            .to("direct:fizzes")
        .otherwise()
            .to("direct:allOtherProducts");

所以如果一个特定的Order是一个Widget的订单,它需要被路由到direct:widgets等等。

我对在每个 when(...) 方法中放入什么感到窒息。我所拥有的不是合法的 Camel DSL 语法,用于说明我想要完成的事情。

所以我问:我在每个 when(...) 方法中添加什么来完成我正在寻找的那种路由?提前致谢!

【问题讨论】:

    标签: java apache-camel enterprise-integration


    【解决方案1】:

    您应该将 order.getProduct() 的值放在标题中并像这样使用它::

    from("direct:start")
            .choice()
                .when(header("product").isEqualTo(Product.Widget))
                    .to("direct:widgets")
                .when(header("product").isEqualTo(Product.Fizz))
                    .to("direct:fizzes")
                .otherwise()
                    .to("direct:allOtherProducts");
    

    编辑:

    您可以使用一个进程(即:在 DSL 中):

    <route id="foo">
        <from uri="direct:start"/>
        <process ref="beanProcessor" />
        <choice>
            <when>
                ...
            </when>
            <when>
                ...
            </when>
            <otherwise>
                ...
            </otherwise>
        </choice>
    

    Bean 声明:

    <bean id="beanProcessor" class="MyProcessor" />
    

    班级:

    public class MyProcessorimplements Processor {
    
         @Override
         public void process(Exchange exchange) throws Exception {
             exchange.getIn().setHeader("headerName", yourOrderObject);
         }
    }
    

    【讨论】:

    • 谢谢@kinaesthesia (+1) - 我如何以及在哪里设置这个标题?假设direct:start 端点实际上是一个生成OrdersOrderConsumer。我假设在from()choice() 方法之间的某个地方我可以以某种方式设置标题?再次感谢!
    • 来自this page 我看到我可以做类似from(...).setHeader("product", constant(order.getProduct()).to(...) 的事情,然而order 实例变量首先来自哪里?!?我认为这是我困惑的根源!
    • 再次感谢@jinaesthesia 和 +1。但我们仍然面临同样的问题:yourOrderObject 来自哪里? exchange 实例中的某个地方?我认为我的精神挂断源于这样一个事实,即我看不到如何在每个 Order 实例沿路线行进时获取它,并将其 getProduct() 值设置为适当的标头。一旦我了解了yourOrderObject 的来源(在上面的示例中会出现编译器错误,因为yourOrderObject 将无法识别),我将能够将它们拼凑在一起。再次非常感谢!
    • 这就是重点。我不知道您的应用程序,但您不能使用 spring 注入来获得参考吗?或者如果可以的话,可以通过 JMS 队列?
    • 否 - 应该有可能(我相信Exchange 是关键)获取传递给处理器的消息的有效负载。你让我完成了 90% 的工作,我对此表示感谢,让我们看看是否有其他人可以在最后 10% 中帮助指导我。再次感谢!
    【解决方案2】:

    我认为 Order 类型是消息体。所以在 Java DSL 中你可以这样做

    from("direct:start")
      .choice()
         .when(body().isInstanceOf(MyOrder.class)).to("direct:myOrder")
         .when(body().isInstanceOf(MyOtheOrder.class)).to("direct:myOtherOrder")
         .otherwise().to("direct:other");
    

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 2015-03-05
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多