0

故事到此为止

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

快速提问:我在 <all> 中使用 <async> 块来并行处理消息。在其中使用 <all> 和 <processor-chain> 标记时,处理不是并行的。任何想法为什么?

路线图

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

路障

退出 <all> 流程后,我得到了一个 MuleMessageCollection。如何阅读它,并将消息组合成一条消息?

我的尝试

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

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

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

所以,归结为一个问题。合并来自 MessageCollection 的消息的方法是什么?

我想在 xml 中执行此操作,而不用 Java 编写自定义转换器。可能吗?我的方法应该是什么?

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

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

4

1 回答 1

0

在其中使用和标签时,处理不是并行的。任何想法为什么?

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

现在对于聚合远程异步响应的问题,如果远程服务没有反映 Mule 标头(绝大多数非 Mule 驱动的服务就是这种情况),您需要确定是否可以使用响应负载中的值,该值将从远程服务反射回来(可以是 SOAP 标头或 SOAP 主体内的字段,如 ID)。如果是这种情况,您可以使用expression-message-info-mapping配置collection-aggregator,指定不会使用 Mule 标头而是使用另一个源来完成关联。

否则,您宁愿保留all块并一个接一个地拨打电话...

于 2012-04-19T15:50:14.950 回答