Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 驼峰拆分器:根据正文添加单个标题_Java_Apache Camel - Fatal编程技术网

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]")