1

我正在尝试向使用<recipient-list>和自定义聚合器组合多个结果的入站 http 端点发出请求。如何让我的入站 http 端点“等待”自定义聚合器的结果?

这是我的示例流程。聚合器完美运行。但由于是异步的,入站 http 端点会立即返回。我真正想做的是从自定义聚合器返回结果作为对 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>
4

1 回答 1

1

在流中使用request-reply路由器AggregationExample而不是收件人列表:分派到另一个执行分派到Source1和的流Source2

一般来说,我不确定你想要实现什么:你构建这个装置只是为了并行读取两个文件吗?或者还有更多?如果只是为了这个,你确定它真的值得吗:并发文件读取没有任何物理限制吗?如果这一切都是为了优化,那么缓存可能是一条更好的路径。

另外,如果收件人recipient-list是静态的,为什么要使用这个路由器而不是all路由器?

最后,您是否对使用 Groovy 表达式来读取文件的 MEL 有问题?

于 2012-11-07T18:54:40.637 回答