WSO2总有效载荷的变化

WSO2总有效载荷的变化,wso2,aggregate,clone,wso2esb,Wso2,Aggregate,Clone,Wso2esb,我目前正试图从序列模板计算聚合元素中的有效负载。我的问题是,这个序列返回的有效负载是由聚合生成的,而不是带有有效负载工厂的构建。这是一个样本 <clone id="TEST" sequential="true"> <target> <sequence> <call-template key="do-soemthing"/> </sequence> </target> <targ

我目前正试图从序列模板计算聚合元素中的有效负载。我的问题是,这个序列返回的有效负载是由聚合生成的,而不是带有有效负载工厂的构建。这是一个样本

<clone id="TEST" sequential="true">
  <target>
    <sequence>
       <call-template key="do-soemthing"/>
    </sequence>
  </target>
  <target>
    <sequence>
       <call-template key="do-something-else"/>
    </sequence>
  </target>
</clone>
<aggregate id="TEST">
 <completeCondition>
   <messageCount max="-1" min="-1"/>
 </completeCondition>
 <onComplete expression="//status">
    <filter xpath="count(//status[text() = 'NOK']) = 0">
      <then>
        <payloadFactory media-type="xml">
          <format>
            <myPayload>
              <status>OK</status>
              <action>foo</action>
            </myPayload>
          </format>
          <args/>
        </payloadFactory>
      </then>
      <else>
        <payloadFactory media-type="xml">
          <format>
            <myPayload>
              <status>NOK</status>
              <action>bar</action>
            </myPayload>
          </format>
          <args/>
        </payloadFactory>
      </else>
    </filter>
  </onComplete>
</aggregate> 

好啊
福
诺克
酒吧
调用此序列时,我希望得到的是返回一个元素,而不是(聚合)。 我怎样才能解决这个问题


谢谢

如果要执行克隆后的中介,必须在克隆中介上设置continueParent=“true”属性

但在您的情况下,这是不够的,因为生成到克隆目标中的消息在克隆中介后丢失:您必须按顺序移动聚合中介,并在每个克隆目标中调用此序列

下面是一个由代理服务(您只需使用internet浏览器即可执行:)和用于聚合模拟响应的序列组成的示例

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TestSOF"
       transports="http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <inSequence>
         <property name="messageType" value="application/xml" scope="axis2"/>
         <clone continueParent="true">
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <resp1 xmlns="">
                           <status>OK</status>
                        </resp1>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="To" action="remove"/>
                  <property name="RESPONSE" value="true"/>
                  <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                  <sequence key="TestSOFAgg"/>
               </sequence>
            </target>
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <resp2 xmlns="">
                           <status>OK</status>
                        </resp2>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="To" action="remove"/>
                  <property name="RESPONSE" value="true"/>
                  <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                  <sequence key="TestSOFAgg"/>
               </sequence>
            </target>
         </clone>
         <log level="full">
            <property name="DEBUG" value="after clone"/>
         </log>
      </inSequence>
   </target>
</proxy>

好啊
好啊

好啊
福
诺克
酒吧
请参阅“克隆后”记录的消息:soap正文为空(如果您使用浏览器对其进行了测试,或者您将收到使用SoapUI发送的soap消息,例如),您的聚合在此无法工作

请参阅“InsideOnComplete”记录的消息:您可以看到soap主体内的所有状态元素


使用其他可以确定的内容修改其中一个模拟响应,然后重试:响应更改,它可以工作;-)

如果要执行克隆后的中介,必须在克隆中介上设置continueParent=“true”属性

但在您的情况下,这是不够的,因为生成到克隆目标中的消息在克隆中介后丢失:您必须按顺序移动聚合中介,并在每个克隆目标中调用此序列

下面是一个由代理服务(您只需使用internet浏览器即可执行:)和用于聚合模拟响应的序列组成的示例

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="TestSOF"
       transports="http"
       startOnLoad="true"
       trace="disable">
   <description/>
   <target>
      <inSequence>
         <property name="messageType" value="application/xml" scope="axis2"/>
         <clone continueParent="true">
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <resp1 xmlns="">
                           <status>OK</status>
                        </resp1>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="To" action="remove"/>
                  <property name="RESPONSE" value="true"/>
                  <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                  <sequence key="TestSOFAgg"/>
               </sequence>
            </target>
            <target>
               <sequence>
                  <payloadFactory media-type="xml">
                     <format>
                        <resp2 xmlns="">
                           <status>OK</status>
                        </resp2>
                     </format>
                     <args/>
                  </payloadFactory>
                  <header name="To" action="remove"/>
                  <property name="RESPONSE" value="true"/>
                  <property name="NO_ENTITY_BODY" scope="axis2" action="remove"/>
                  <sequence key="TestSOFAgg"/>
               </sequence>
            </target>
         </clone>
         <log level="full">
            <property name="DEBUG" value="after clone"/>
         </log>
      </inSequence>
   </target>
</proxy>

好啊
好啊

好啊
福
诺克
酒吧
请参阅“克隆后”记录的消息:soap正文为空(如果您使用浏览器对其进行了测试,或者您将收到使用SoapUI发送的soap消息,例如),您的聚合在此无法工作

请参阅“InsideOnComplete”记录的消息:您可以看到soap主体内的所有状态元素


使用其他可以确定的内容修改其中一个模拟响应,然后重试:响应更改,它可以工作;-)

感谢您的回答,如果我设置continueParent=“true”我将无法在克隆结束时获得克隆序列的结果,我将只保留不同调用之前的有效负载。我将尝试在每个克隆元素中进行聚合,但这听起来既不符合逻辑,也不自然,因为我一直认为聚合只应在所有序列都完成时进行一次。错误,聚合中介必须按响应的次数调用,这就是messageCount处于completeCondition的原因:您可以使用clone mediator设置-1,因为ESB知道已经实例化了2个目标。当completeCondition为true(aggreage mediator被调用的“最后一次”时间)时,“onComplete”部分被执行。我已经做了几次测试,但我从未从聚合中获取有效负载,我只是检索原始有效负载。可能是因为我没有在代理中使用它,而是在一个常规的序列中使用它吗?代理的inSeque