我正在尝试拆分包含地图的邮件。根据我的教程,我必须使用自定义服务来实现实际的拆分
public class CustomService {
public List split(Map map) {
return map.values();
}
}
//route ...
.split().method(CustomService.class, "split")
.choice()
//...
.end()
到目前为止,一切正常。但是,现在我想根据我想在split(Map)
消息中设置的某个标头值以不同方式路由消息。是否可以在拆分期间为每条消息添加不同的标头值?
答案 0 :(得分:7)
如果您返回List<Message>
例如org.apache.camel.Message
个实例,您可以在分割方法中添加标题,以便调整标题。
长篇大论(思考伪代码)
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;
}
}
答案 1 :(得分:2)
@Claus,谢谢 - 你的解决方案(几乎)工作了。只有改变而不是
msg.setHeaders(exchange.getIn().getHeaders();
我有
msg.setHeaders(new HashMap<String, Object> (exchange.getIn().getHeaders()));
这样每条消息都有自己的标头。
答案 2 :(得分:0)
我建议使用另一种解决方案,因为如果您在一种方法中拆分并添加骆驼标头,则对于其他方法而言,在同一方法中发生这种情况并不明显。 相反,我建议您将地图“转换”为自定义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]")
通过这种方法,在生成标头的路径中始终很明显,然后将其用于端点。
我亲自尝试在实现骆驼路线时避免使用java.util.Map
,因为大多数情况下,有一个更好的解决方案,而不是像自己的POJO那样的java.util.Map
。