The story so far
我有一个SOAP服务,它将响应(比如Response_A)发送到<all>流 . 在流程中,有三个SOAP服务(比如B,C和D)从Response_A获取输入 . 我从Response_A中获取字段并使用XSLT,我可以为B,C和D制定请求 .
快速提问:我在<all>中使用<async>块来并行处理消息 . 当在其中使用<all>和<processor-chain>标签时,处理并不平行 . 有什么想法吗?
The roadmap
我将读取所有三个B,C和D的响应,并将它们组合成一个响应(可能再次使用XSLT)并将其发送到E.
The roadblock
在退出<all>流程后,我得到了一个MuleMessageCollection . 如何阅读,并将消息组合成一条消息?
My attempts
我尝试根据相关ID聚合消息但我注意到只有当来自A的消息被<all>标记拆分并且被发送到B,C和D时才存在相关ID . 相关ID在SOAP信封作为这些服务的响应,即使我将enableMuleSoapHeaders转为true也是如此 . 我无法修改服务 . 那么,如何让相关ID出现在SOAP响应中(如果我想合并消息,则提供相关ID是绝对必要的)
我想,我还需要组大小来聚合消息 .
我甚至尝试使用消息属性转换器添加相关ID,但它没有那样工作 . 我被一个MessageCollection困住了,并且不知道如何阅读它,即使其中可能存在具有相关id的消息 .
所以,归结为一个问题 . 从MessageCollection合并消息的方法有哪些?
我想在xml中执行此操作,而无需在Java中编写自定义转换器 . 可能吗?我的方法应该是什么?
Note :来自B,C和D的响应消息具有不同的DOM结构 . 我想要创建的合并消息与A,B,C和D的所有响应和请求具有不同的DO .
如果它有帮助,我试图处理类似于此处描述的情况:http://ricston.com/blog/?p=640唯一不同的是,我正在使用flow和all标签 .
1 回答
这是因为所有和处理器链本质上是同步的:它们不会并行化任何东西 .
现在针对聚合远程异步响应的问题,如果远程服务没有反映Mule标头(绝大多数非Mule驱动服务的情况),您需要找出是否可以使用响应有效负载内部的值,它将从远程服务(可能是SOAP标头或字段,如SOAP内部的ID)反射回来 . 如果是这种情况,您可以使用expression-message-info-mapping配置collection-aggregator,该映射指定不使用Mule标头而是使用其他源完成关联 .
否则,你宁愿保留所有块并一个接一个地打电话......