编辑:具体来说,我想我要求一种优雅的方式来指定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我正在写一个,它可能是任何处理器)。
我知道我可以创建一个可分解的对象,其上有好的和坏的项目,然后多播并处理不同部分的每个好的和坏的部分,但我真的想要一个简洁的可重用机制(例如内置到处理器或端点)
答案 0 :(得分:1)
在Camel中,from()和to()之间的东西是Exchange
,它被视为单个消息。该组件应该只是Endpoint
实例的工厂,它可以创建或发送交换。它不应该处理消息(这听起来像这里)所以没有真正的错误或好对象的概念,那是Route
和Processors
/ {{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在这方面没有任何限制,你肯定会实现这一点。如果您有任何具体问题,我可以澄清一下。