2012-11-06 22 views
1

我正在嘗試向使用<recipient-list>和自定義聚合器合併多個結果的入站http端點發出請求。如何讓我的入站http端點「等待」自定義聚合器的結果?具有請求響應交換模式的Mule自定義聚合器

這裏是我的示例流程。聚合器完美運作。但由於是異步的,入站http端點立即返回。我真正想做的是從Custom Aggregator返回結果作爲對http端點的響應。我覺得我缺少一些簡單的東西。

<flow name="AggregationExample"> 
    <http:inbound-endpoint 
     exchange-pattern="request-response" 
     host="localhost" 
     port="8082" 
     path="test/aggregate" 
     /> 

    <recipient-list evaluator="groovy" expression="['vm://source1','vm://source2']"></recipient-list> 

     <!-- How do I wait for result of custom aggregator? --> 
</flow> 

<flow name="SourceAggregation"> 
    <vm:inbound-endpoint path="sourceresult" /> 

    <custom-aggregator failOnTimeout="true" class="com.example.MySourceAggregator"/> 

    <logger message="RESULTS: #[payload]"/> 
</flow> 

<flow name="Source1"> 
    <vm:inbound-endpoint path="source1" /> 

    <set-payload value="#[groovy:Thread.currentThread().getContextClassLoader().getResourceAsStream('example-source1.json').text]"/> 

    <vm:outbound-endpoint path="sourceresult" /> 
</flow> 

<flow name="Source2"> 
    <vm:inbound-endpoint path="source2" /> 

    <set-payload value="#[groovy:Thread.currentThread().getContextClassLoader().getResourceAsStream('example-source2.json').text]"/> 

    <vm:outbound-endpoint path="sourceresult" /> 
</flow> 

回答

1

使用在AggregationExample流,而不是一個收件人列表request-reply路由器:調度到執行調度到Source1Source2另一個流。

一般來說,我不確定你想要實現什麼,但是:你是否只是爲了同時讀取兩個文件而構建這個裝置?或者還有更多嗎?如果僅僅是這樣,你確定它真的值得嗎:併發文件讀取沒有任何物理限制嗎?如果全部用於優化,緩存可能是更好的途徑。

此外,如果recipient-list中的收件人是靜態的,爲什麼使用此路由器而不是all路由器?

最後,您是否遇到了使用Groovy表達式讀取文件的MEL問題?

+0

這兩個文件只是一個更復雜的查找過程的演示。同樣,收件人列表也不是靜態的,而是演示的一部分。我能夠通過添加請求回覆來實現我所需要的。謝謝! – Jeff