聚合来自 <all> Mule 流的消息



到目前为止的故事

我有一个 SOAP 服务,它将其响应(例如 Response_A)发送到<全部>流。在流中,有三个 SOAP 服务(例如 B、C 和 D)从Response_A获取输入。我正在从Response_A中获取字段并使用XSLT,我可以制定B,C和D的请求。

快速问题:我在中使用块来并行处理消息。当在其中使用和<处理器链>标签时,处理不是并行的。知道为什么吗?

路线图

我将读取所有三个 B、C 和 D 的响应,并将它们组合成一个响应(可能再次使用 XSLT)并将其发送给 E。

路障

从<全部>流中出来后,我得到了一个MuleMessageCollection。如何阅读它,并将消息合并为一条消息?

我的尝试

我尝试根据相关 ID 聚合消息,但我注意到仅当来自 A 的消息被 标记拆分并发送到 B、C 和 D 时,才会存在相关 ID。相关 ID 在作为这些服务的响应提供的 SOAP 信封中消失,即使我将 enableMuleSoapHeaders 转换为 true。我无法修改服务。那么,如何使相关 ID 出现在 SOAP 响应上(如果我想合并消息,则绝对需要相关 ID)

我想,我还需要组大小来聚合消息。

我什至尝试使用消息属性转换器添加相关 ID,但它没有那样工作。我被困在 MessageCollection 上,不知道如何阅读它,即使里面可能有带有相关 ID 的消息。

所以,它归结为一个问题。合并来自消息集合的消息的方法有哪些?

我想用 xml 来做这件事,而不是用 Java 编写自定义转换器。可能吗?我应该采取什么方法?

注意:来自 B、C 和 D 的响应消息具有不同的 DOM 结构。我要创建的合并消息与 A、B、C 和 D 的所有响应和请求具有不同的 DO。

如果有帮助,我会尝试处理类似的情况,如下所述:唯一的区别是,http://ricston.com/blog/?p=640 我正在使用流和 all 标签。

使用和标记时,处理不是并行的。知道为什么吗?

这是因为所有处理器链本质上都是同步的:它们不会并行化任何东西。

现在,对于聚合远程异步响应的问题,如果远程服务不反射回 Mule 标头(绝大多数非 Mule 驱动的服务都是这种情况),则需要确定是否可以在响应有效负载中使用将从远程服务反射回来的值(可以是 SOAP 标头或字段, 就像 ID,在 SOAP 正文中)。如果是这种情况,您可以使用表达式-消息-信息-映射配置集合聚合器,该表达式指定不会使用 Mule 标头而是使用另一个源完成关联。

否则,您宁愿保留所有块并一个接一个地进行调用......

最新更新