[英]Accessing the body of a split entrySet in Apache Camel
我的消息正文包含一個 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 並使用正確的類型直接注入 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]
}
然后你在你的路由中調用它
.method(new ReadMapEntryBean()) // if Bean contains only 1 method
或者
.method(new ReadMapEntryBean(), "readMap") // if there are other methods
處理器接口相當陳舊、笨拙且難以測試。 POJO 更易於使用,並且它們與 Camel 配合得很好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.