Camel Splitter:根据正文添加单个标题

时间:2015-04-10 11:37:16

标签: java apache-camel

我正在尝试拆分包含地图的邮件。根据我的教程,我必须使用自定义服务来实现实际的拆分

public class CustomService {
  public List split(Map map) {
    return map.values();
  }
}

//route ...
.split().method(CustomService.class, "split")
   .choice()
   //...
.end()

到目前为止,一切正常。但是,现在我想根据我想在split(Map)消息中设置的某个标头值以不同方式路由消息。是否可以在拆分期间为每条消息添加不同的标头值?

3 个答案:

答案 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