【问题标题】:WSO2 ESB aggregate mediator not working properlyWSO2 ESB 聚合调解器无法正常工作
【发布时间】:2014-04-04 22:00:34
【问题描述】:

我正在使用 wso2ESB 4.8.0,我在这个 url 上关注了示例:

https://docs.wso2.org/display/ESB480/Sample+62:+Routing+a+Message+to+a+Dynamic+List+of+Recipients+and+Aggregating+Responses

编写此代理服务:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="adminBroadcastEndpoint"
       transports="https,http"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <send>
            <endpoint>
               <recipientlist>
                  <endpoint>
                     <address uri="http://127.0.0.1:8080/RestService/rest/servizio/"/>
                  </endpoint>
                  <endpoint>
                     <address uri="http://127.0.0.1:8081/RestService/rest/servizio/"/>
                  </endpoint>
           </recipientlist>
        </endpoint>
         </send>
         <drop/>
      </inSequence>
      <outSequence>

         <payloadFactory media-type="xml">
            <format>
                <broadcast>
                $1
               </broadcast>
            </format>
            <args>
               <arg evaluator="xml" expression="$body/root"/>
            </args>
        </payloadFactory>

        <aggregate>
           <completeCondition>
               <messageCount/>
            </completeCondition>
           <onComplete xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope" expression="/">
               <send/>
         </onComplete>
       </aggregate>

      </outSequence>
   </target>
   <description/>
</proxy>

在收件人列表中,有两台服务器使用 xml 字符串进行应答。第一个服务器回答

<root>
    <codice>0</codice>
    <messaggio>MESSAGE1</messaggio>
    <result><name>CorreggiPecJob1</name><group>POSTA1</group></result>
    <result><name>SchedulaIndiceJob1</name><group>INDICE1</group></result>
</root>

第二个服务器:

 <root>
    <codice>0</codice>
    <messaggio>MESSAGE2</messaggio>
    <result><name>CorreggiPecJob2</name><group>POSTA2</group></result>
    <result><name>SchedulaIndiceJob2</name><group>INDICE2</group></result>
</root>

在聚合调解器之后,我应该期待所有这 2 条消息合并的结果......但在来自代理服务的响应中,我只得到第二个服务器答案或第一个随机答案。 如果我在 onComplete 标记之后突然放置一个日志调解器,那么 esb 会打印带有两个响应的整个合并消息,但似乎在发送调解器上有些东西丢失了。 为什么会这样?

另一个问题是:为什么xpath表达式喜欢

$body/广播//结果 不处理这个异常?

2014-03-02 17:37:32,021] ERROR - AggregateMediator Error evaluating expression:  $body/broadcast//result
org.apache.synapse.SynapseException: Could not find matching elements to aggregate.

我意识到,如果我定义一个命名空间和一个前缀以附加到 payloadfactory 中,例如:

<payloadFactory xmlns:m0="my.namespace" media-type="xml">
            <m0:format>
                <m0:broadcast>
                $1
               </m0:broadcast>
            </m0:format>
            <args>
               <arg evaluator="xml" expression="$body/root"/>
            </args>
 </payloadFactory>

表达式:$body/m0:broadcast 工作正常...所以命名空间定义是强制性的吗?

我有什么遗漏吗?谢谢

【问题讨论】:

    标签: xpath wso2 aggregate wso2esb


    【解决方案1】:

    如果 XML 元素在命名空间中,那么 XPath 必须定义和使用命名空间前缀,或者在路径步骤中指定任何命名空间,如下所示:

    $body/*:broadcast
    

    【讨论】:

    • 我认为 WSO 不支持 XPath 2.0,因此如果您想使用通配符命名空间,则必须选择 $body/*[local-name(.) = 'broadcast']
    • 感谢我在我的第一篇文章中添加了一个答案,因为我需要用一些代码来丰富它。我的代理响应还是有问题
    【解决方案2】:

    我在这里找到了答案:wso2 ESB : Split / Gather Pattern - Single Response

    我使用丰富的调解器解决了。但我认为聚合调解器的行为并不是真正正确的......也许应该检查一下。

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 2018-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 1970-01-01
      • 2017-03-18
      • 2021-01-25
      • 2016-01-01
      相关资源
      最近更新 更多