Java 驼峰拆分器:根据正文添加单个标题
我正在尝试拆分包含地图的邮件。根据我的教程,我必须使用自定义服务来实现实际的拆分Java 驼峰拆分器:根据正文添加单个标题,java,apache-camel,Java,Apache Camel,我正在尝试拆分包含地图的邮件。根据我的教程,我必须使用自定义服务来实现实际的拆分 public class CustomService { public List split(Map map) { return map.values(); } } //route ... .split().method(CustomService.class, "split") .choice() //... .end() 到目前为止,一切正常。但是,现在我想根据我想在split(
public class CustomService {
public List split(Map map) {
return map.values();
}
}
//route ...
.split().method(CustomService.class, "split")
.choice()
//...
.end()
到目前为止,一切正常。但是,现在我想根据我想在
split(Map)
消息中设置的某些头值,对消息进行不同的路由。是否可以在拆分过程中为每条消息添加不同的标题值?如果返回可调整标题的列表,则只能在拆分方法中添加标题
一长串的东西(伪代码)
@克劳斯,谢谢-你的解决方案(几乎)奏效了。只有改变,而不是改变
msg.setHeaders(exchange.getIn().getHeaders();
我有
msg.setHeaders(new HashMap<String, Object> (exchange.getIn().getHeaders()));
msg.setHeaders(新的HashMap(exchange.getIn().getHeaders());
这样,每条消息都有自己的头 我会建议另一种解决方案,因为如果在一个方法中拆分并添加驼峰头,那么其他方法就不太明显了,这是在同一个方法中发生的。
相反,我建议您将地图“转换”为自定义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路由时尽量避免使用java.util.Map
,因为大多数时候都有一个更好的解决方案,而不是像自己的POJO那样使用java.util.Map
。但是,这难道不会导致消息包含消息作为有效负载吗?因此外部消息不包含头值,因此我不能将其用于路由消息-is@Claus易卜生msg.setHeader(“foo”,mapKey);结果每个消息都有相同的“foo”标题。。。
.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]")