我是Apache Camel的新手,我在理解如何实现一个简单的集成任务时遇到了问题:
我需要迭代集合中的每一项,并通过自定义转换器将其转换为另一种类型。
我似乎应该使用Split和聚合器,但是如何约束聚合器使用原始列表中的所有项,而不是更多,更少。此外,如何将一个项目转换为另一个项目?我应该使用类型转换器吗?
有人能给我举个简单的例子吗?
更新1
对不起,我不得不撤销对所提供的例子的接受,因为它实际上没有回答我的问题。下面是用例限定:我需要拆分和转换来自to("bean:someBean")调用的方法返回值,而不是从某个端点拆分和转换输入值。
所以用例是
from("endpoint")List,to("bean:someBean"))ListList返回给消费者更新2
所以,我可以肯定比使用end()方法不能解决我的问题。
以下是代码:
rest("some/service").get().produces("application/json").to("bean:someBean?method=getListOfObjects").route().split(body(), (oldExchange, newExchange) -> {
List<ObjectToConvert> oldList = oldExchange.getIn(List.class);
List<NewObject> convertedList = taskList.stream().map(ObjectToConvert::new).collect(Collectors.toList());
newExchange.getOut().setBody(convertedList);
return newExchange;
}).end();使用这种路由,我在应用服务器上得到以下异常:
19:30:21,126 ERROR [org.jboss.as.controller.management-operation] (XNIO-1 task-5) JBAS014613: Operation ("full-replace-deployment") failed - address: (undefined) - failure description: {"JBAS014671: Failed services" => {"jboss.undertow.deployment.default-server.default-host./CamundaLearningCamel" => "org.jboss.msc.service.StartException in service jboss.undertow.deployment.default-server.default-host./CamundaLearningCamel: Failed to start service
Caused by: java.lang.RuntimeException: org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: org.apache.camel.RuntimeCamelException: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: org.apache.camel.FailedToCreateRouteException: Failed to create route route2 at: >>> Split[{body} -> []] <<< in route: Route(route2)[[From[rest:get:task/all?produces=application%2... because of Definition has no children on Split[{body} -> []]
Caused by: java.lang.IllegalArgumentException: Definition has no children on Split[{body} -> []]"}}发布于 2014-11-24 23:57:36
下面是一个拆分聚合和转换列表消息的完整示例。
发布于 2016-12-16 09:38:46
对于将来的参考,可以迭代列表的另一种方法是使用Java的loop构造。下面是一个例子:
from("direct:myDirect")
.loop(header("LIST_LENGTH")) // You will set this header in the processor before with the list lenght.
.process(new Processor(){
@Override
public void proocess(Exchange arg0){
MyObj currentElement = (MyObj) arg0.getIn().getBody(List.class).get(LOOP_INDEX);
// Do your processing here.
}
})
.end()
.end();LOOP_INDEX属性将包含当前迭代,从0开始到LIST_LENGHT头值,因此您可以使用它从列表中获取当前元素。
注意双end()方法调用:一个用于结束循环,另一个用于结束路由。
文档:http://camel.apache.org/loop.html
发布于 2014-11-24 14:48:20
拆分器和聚合器是正确的,来自http://camel.apache.org/splitter.html的“拆分聚合请求/回复示例”显示了您所需要的。
您需要在拆分器之后的“转换”对象列表吗?如果是的话,http://camel.apache.org/aggregator2.html中的“在http://camel.apache.org/aggregator2.html中使用列表”这一点看上去很适合您的需要。
好心的问候,土工
https://stackoverflow.com/questions/27105526
复制相似问题