首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Camel Splitter:根据body添加单个headers

Camel Splitter:根据body添加单个headers
EN

Stack Overflow用户
提问于 2015-04-10 19:37:16
回答 3查看 5.6K关注 0票数 3

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

代码语言:javascript
复制
public class CustomService {
  public List split(Map map) {
    return map.values();
  }
}

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

到目前为止,一切工作正常。但是,现在我希望根据要在split(Map)消息中设置的一些标头值,对消息进行不同的路由。是否可以在拆分过程中为每封邮件添加不同的标头值?

EN

回答 3

Stack Overflow用户

发布于 2015-04-11 14:11:55

如果你返回一个List<Message>例如org.apache.camel.Message实例,你只能在split方法中添加headers,在那里你可以调整headers。

一些很长的行(脑海中的伪代码)

代码语言:javascript
复制
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;
  }
}
票数 8
EN

Stack Overflow用户

发布于 2016-04-16 03:03:02

@Claus,谢谢-你的解决方案(几乎)奏效了。唯一的改变不是

代码语言:javascript
复制
msg.setHeaders(exchange.getIn().getHeaders();

我有

代码语言:javascript
复制
msg.setHeaders(new HashMap<String, Object> (exchange.getIn().getHeaders()));

这样,每条消息都有自己的头。

票数 2
EN

Stack Overflow用户

发布于 2018-11-28 00:30:32

我会建议另一种解决方案,因为如果你在一个方法中拆分和添加驼峰头,那么对于其他人来说,这在同一个方法中发生的情况就不那么明显了。相反,我建议您将您的映射“转换”为自定义POJO,其中包含拆分和路由所需的所有信息。

因此,映射中的每个条目都成为自己的自定义POJO,您可以将其收集到一个列表中,然后该列表可拆分。

下面是我在(几乎)相同的情况下所做的一个例子:

代码语言:javascript
复制
.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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29560473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档