访问 Apache Camel 中拆分条目集的主体

JMo*_*ore 5 java split hashmap apache-camel

我的消息正文包含一个 HashMap。

我按其条目集分割此消息:

.from(FROM)
   .aggregate(...)

   // create an iterable
   .transform(simple("${in.body.entrySet()}"))

   // split over the Iterable
   .split(body())
      .process(new ReadMapEntry())
      .to(TO)
   .end()
.end();
Run Code Online (Sandbox Code Playgroud)

现在尝试在处理器中检索这些条目。我最接近的是尝试投射这个。我发现了使用 ArrayList 的类似示例,但我无法让它们为此工作......在此类作品中,但由于 Map.Entry 的泛型,它触发了未经检查的强制转换警告。

public void process(final Exchange ex) throws Exception
{     
   Map.Entry<A, B> entry = (Map.Entry<A, B>) ex.getIn().getBody(Map.Entry.class);
   (...)
}
Run Code Online (Sandbox Code Playgroud)

解决方案

我的目标是避免与转换继承类相关的警告。simple我最终使用了关键字。这样我就可以将地图的值传递到处理器中(从而避免未经检查的强制转换警告)并通过标头访问密钥。

.from(FROM)
   .aggregate(...)

   .split(simple("${in.body.entrySet}"))
      .setHeader(KEY_VALUE_AS_HEADER, simple("${body.getKey}"))
      .setBody(simple("${body.getValue}"))
      .process(new ReadMapEntry())
      .to(TO)
   .end()
.end();
Run Code Online (Sandbox Code Playgroud)
public void process(final Exchange ex) throws Exception
{     
   A value = ex.getIn().getBody(A.class);
   B key = ex.getIn().getHeader(KEY_VALUE_AS_HEADER, B.class);
   (...)
}
Run Code Online (Sandbox Code Playgroud)

bur*_*rki 2

您可以尝试使用一个简单的 Bean 并直接注入正确类型的 Body。

// simple POJO, does not implement Processor interface
public void readMap(@Body Map.Entry<A, B> mapEntry) {     
     // use mapEntry (message body) directly instead of extracting it from Exchange
     mapEntry.[whatever]
}
Run Code Online (Sandbox Code Playgroud)

然后你在你的路线中调用它

.method(new ReadMapEntryBean()) // if Bean contains only 1 method
Run Code Online (Sandbox Code Playgroud)

或者

.method(new ReadMapEntryBean(), "readMap") // if there are other methods
Run Code Online (Sandbox Code Playgroud)

处理器接口相当陈旧、笨拙且难以测试。POJO 更容易使用,并且与 Camel 配合得很好。

有关更多详细信息,请参阅Camel 文档中的参数绑定注释Bean 集成