我正在尝试拆分包含地图的消息。根据我的教程,我必须使用自定义服务来实现实际的拆分
public class CustomService {
public List split(Map map) {
return map.values();
}
}
//route ...
.split().method(CustomService.class, "split")
.choice()
//...
.end()到目前为止,一切工作正常。但是,现在我希望根据要在split(Map)消息中设置的一些标头值,对消息进行不同的路由。是否可以在拆分过程中为每封邮件添加不同的标头值?
发布于 2015-04-11 14:11:55
如果你返回一个List<Message>例如org.apache.camel.Message实例,你只能在split方法中添加headers,在那里你可以调整headers。
一些很长的行(脑海中的伪代码)
public class CustomService {
public List split(Exchange exchange) {
List list = new ArrayList();
Map map = exchange.getIn().getBody(Map.class);
for (Object value : map.values()) {
// either copy or create a new DefaultMessage
Message msg = new DefaultMessage();
msg.setBody(value);
// we want to copy the existing headers
msg.setHeaders(exchange.getIn().getHeaders();
// and then customize the headers
msg.setHeader("foo", "bar");
list.add(msg);
}
return list;
}
}发布于 2016-04-16 03:03:02
@Claus,谢谢-你的解决方案(几乎)奏效了。唯一的改变不是
msg.setHeaders(exchange.getIn().getHeaders();我有
msg.setHeaders(new HashMap<String, Object> (exchange.getIn().getHeaders()));这样,每条消息都有自己的头。
发布于 2018-11-28 00:30:32
我会建议另一种解决方案,因为如果你在一个方法中拆分和添加驼峰头,那么对于其他人来说,这在同一个方法中发生的情况就不那么明显了。相反,我建议您将您的映射“转换”为自定义POJO,其中包含拆分和路由所需的所有信息。
因此,映射中的每个条目都成为自己的自定义POJO,您可以将其收集到一个列表中,然后该列表可拆分。
下面是我在(几乎)相同的情况下所做的一个例子:
.log(INFO, log, "Some information in my route")
.process(mapToPOJOConverter) // An custom processor which does nothing more than converting the Map to your java.util.List of POJO's. Can also be a custom TypeConverter
.split(simple("${body}")).shareUnitOfWork().stopOnException() //Split the List so that in your splitted route you'll get each custom POJO
.to("direct:internAfterSplit")
from("direct:internAfterSplit").routeId(ROUTE_ALIAS_KUNDENARBEITSLISTE_INTERN) //Always use routeId for easy identifying where problems might be
.log(INFO, log, "Start Route: ${routeId}")
.bean(yourExchangeEnricher, "setHeadersIntoExchange")
.log(INFO, log, "Message is rooted to: [your custom endpoint]")
.to("[your custom endpoint which depends on the headers]")通过这种方式,在生成报头的路由中总是显而易见的,然后在端点中使用这些报头。我个人在实现Camel routes时尽量避免使用java.util.Map,因为大多数时候有一个更好的解决方案,而不是像自己的POJO那样的java.util.Map。
https://stackoverflow.com/questions/29560473
复制相似问题