簡體   English   中英

在 Apache Camel 中訪問拆分條目集的主體

[英]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 配合得很好。

有關更多詳細信息,請參閱 Camel 文檔中的參數綁定注釋Bean 集成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM