Apache Camel - 什么是Camel从组件端点同时发送错误和良好对象的方式?

时间:2016-04-13 19:51:28

标签: apache-camel

编辑:具体来说,我想我要求一种优雅的方式来指定2个端点,我想从1个交换的输入中发送2个不同的交换。

我知道Camel' can'这样做 - 但我只有不优雅的方法,包括将包含两种类型的对象发送到多播()和每个部分上的处理器删除

我希望附加源对象时可能存在多个错误消息。我可以把它们作为例外抛出,但这感觉不对。我想知道'正确的'方法可能是。我几乎只是希望能够将错误端点指定为我的组件的目标

目前我有

camel.addComponent( "my", new MyComponent() )


from( some source ) 
... processing // Lists of input objects as body of in
... onException()
.to( "my:endpoint" )

MyComponent< - MyEndpoint< - MyProducer

我想处理到达MyProducer的每个List对象中的项目。我处理元素并将失败的项目发送到一个端点,并将好的项目发送到端点

我没有看到实现这一目标的好/优雅方式。如果它是单个元素(即不是集合),我可以抛出异常并在onException流中捕获它。

但我真的希望能够拿走物品,分开好物品并以一种方式发送物品,然后将不良物品发送给另一物品。

换句话说,我想同时从端点的相同输入向2个不同的端点发送2条不同的消息。 (端点在这里实际上并不重要,它是juts我正在写一个,它可能是任何处理器)。

我知道我可以创建一个可分解的对象,其上有好的和坏的项目,然后多播并处理不同部分的每个好的和坏的部分,但我真的想要一个简洁的可重用机制(例如内置到处理器或端点)

2 个答案:

答案 0 :(得分:1)

在Camel中,from()和to()之间的东西是Exchange,它被视为单个消息。该组件应该只是Endpoint实例的工厂,它可以创建或发送交换。它不应该处理消息(这听起来像这里)所以没有真正的错误或好对象的概念,那是RouteProcessors / {{1} } 决定。

如果您想在一次交换中完成所有操作,那么您只需让您的处理器添加2个列表即可交换属性并根据内容进行路由。

Beans

然而,这不是一个好的骆驼模式。它很乱,并试图将属性视为不同的消息,这与骆驼的工作原理相反。从路径的角度来看,交换是一个原子单元,因此如果您需要打破消息,通常会将Exchange的内容路由为from("direct:somesource") .process(new Processor() { public void process(Exchange exchange) { // get contents, // turn it into a list // List<Object> worked = new ArrayList<>(); List<Object> failed = new ArrayList<>(); for (Object o : listFromBody) { try { // do work worked.add(o); } catch (Exception e) { failed.add(o) } } exchange.getIn().setProperty("worked", worked); exchange.getIn().setProperty("failed", failed); } };) .choice() .when(header("failed").isNotEqualTo(null)) // might be a better way to do this, I've not got the IDE open .process(turnFailedHeaderIntoMessageBody) .to("direct:errorQueue") .otherwise() .process(turnWorkedHeaderIntoMessageBody) .to("direct:workedQueue"); 不同的路由。

我个人会将列表拆分为单独的交换并单独处理它们:

Exchange

答案 1 :(得分:0)

这完全取决于您的数据模型。但Camel在这方面没有任何限制,你肯定会实现这一点。如果您有任何具体问题,我可以澄清一下。