我的消息正文包含一个 HashMap。
我通过它的 entrySet 拆分了这条消息:
.from(FROM)
.aggregate(...)
// create an iterable
.transform(simple("${in.body.entrySet()}"))
// split over the Iterable
.split(body())
.process(new ReadMapEntry())
.to(TO)
.end()
.end();
现在尝试在处理器中检索这些条目。我得到的最接近的是试图转换这个。我找到了使用 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);
(...)
}
解决方案
我的目标是避免与转换继承类相关的警告。我最终使用了
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();
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);
(...)
}
最佳答案
您可以尝试使用简单的 Bean 并直接注入(inject)具有正确类型的 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]
}
然后你在你的 route 调用它
.method(new ReadMapEntryBean()) // if Bean contains only 1 method
或者
.method(new ReadMapEntryBean(), "readMap") // if there are other methods
处理器接口(interface)相当陈旧、笨拙且难以测试。 POJO 更容易使用,并且它们与 Camel 配合得很好。
见 Parameter Binding Annotations和 Bean Integration来自 Camel Docs 以获取更多详细信息
关于java - 在 Apache Camel 中访问拆分 entrySet 的主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59953704/