如何忽略进入我的代理服务器的空Soap消息

时间:2015-02-25 14:55:22

标签: wso2 wso2esb wso2carbon synapse

我一直在忙着重构我的序列和代理(参见WSO2 Aggregate Mediator premature/incomplete/unknown completion)。在按照之前的问题让它工作之后,它产生了一些不必要的行为。我只更改了序列的名称,没有别的。

现在我的第二个聚合器之后:

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <log level="custom">
      <property name="pocSearchRsHandlerSeq reached" value="++++++++++++++=========Aggregating now========+++++++++++++++++=="></property>
   </log>
   <aggregate id="iT">
      <completeCondition>
         <messageCount min="-1" max="-1"></messageCount>
      </completeCondition>
      <onComplete xmlns:ns="http://org.apache.synapse/xsd" expression="//productDetails">
         <log level="custom" separator=",">
            <property name="::::" value="======================= Formatting the Aggregated Responses. ==============="></property>
         </log>
         <log level="full"></log>
      </onComplete>
   </aggregate>
   <aggregate>
      <completeCondition>
         <messageCount min="-1" max="-1"></messageCount>
      </completeCondition>
      <onComplete xmlns:ns="http://org.apache.synapse/xsd" expression="//productDetails">
         <payloadFactory media-type="xml">
            <format>
               <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prod="http://za.co.pepkor/product_service/">                  
                  <soapenv:Body>                     
                     <prod:productSearchResp>                                                                                                                   $1                                                                                                </prod:productSearchResp>                  
                  </soapenv:Body>               
               </soapenv:Envelope>
            </format>
            <args>
               <arg expression="//productDetails" evaluator="xml"></arg>
            </args>
         </payloadFactory>
         <respond></respond>
      </onComplete>
   </aggregate>
</sequence>

现在,它正在丢弃(或遗忘)聚合消息(例如之前看起来像这样):

?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Body>
        <productDetails>
            <productID>1452168</productID>
            <productName>PUMPS</productName>
            <productSize>7</productSize>
            <productColour>ORANGE</productColour>
            <productType>SHOE</productType>
            <sourceID>SHC</sourceID>
        </productDetails>
        <productDetails>
            <productID>1124596</productID>
            <productName>REEBOK_SNEAKERS</productName>
            <productSize>7</productSize>
            <productColour>BROWN</productColour>
            <productType>SHOES</productType>
            <sourceID>SHC</sourceID>
        </productDetails>
        <productDetails>
            <productID>1123456</productID>
            <productName>NIKE_SHIRTS</productName>
            <productSize>7</productSize>
            <productColour>RED</productColour>
            <productType>SHIRT</productType>
            <sourceID>SHC</sourceID>
        </productDetails>
    </soapenv:Body>
</soapenv:Envelope>

然后将其发送到第二次聚合:

<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body></soapenv:Body></soapenv:Envelope> 

由于某种原因,我将很多这些空消息带回了我的代理outSequence:

TID: [0] [ESB] [2015-02-25 16:22:01,023] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Synapse received an asynchronous response message {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [0] [ESB] [2015-02-25 16:22:01,023] DEBUG {org.apache.synapse.mediators.base.SequenceMediator} -  Start : Sequence <ackServiceSearchSeqRs> {org.apache.synapse.mediators.base.SequenceMediator}
TID: [0] [ESB] [2015-02-25 16:22:01,023] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Received To: null {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [0] [ESB] [2015-02-25 16:22:01,024] DEBUG {org.apache.synapse.mediators.base.SequenceMediator} -  Sequence <SequenceMediator> :: mediate() {org.apache.synapse.mediators.base.SequenceMediator}
TID: [0] [ESB] [2015-02-25 16:22:01,024] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  SOAPAction:  {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [0] [ESB] [2015-02-25 16:22:01,024] DEBUG {org.apache.synapse.mediators.base.SequenceMediator} -  Mediation started from mediator position : 0 {org.apache.synapse.mediators.base.SequenceMediator}
TID: [0] [ESB] [2015-02-25 16:22:01,024] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  WSA-Action:  {org.apache.synapse.core.axis2.SynapseCallbackReceiver}
TID: [0] [ESB] [2015-02-25 16:22:01,025] DEBUG {org.apache.synapse.core.axis2.SynapseCallbackReceiver} -  Body : 
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body></soapenv:Body></soapenv:Envelope> {org.apache.synapse.core.axis2.SynapseCallbackReceiver}

每次至少2次。我已经禁用了continueParent。

修改

查看WSO2 ESB : Aggregate node droppping message after aggregation了解更多背景信息

1 个答案:

答案 0 :(得分:0)

<aggregate id="iT">的onComplete中,您将获得聚合 product详细信息如下

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prod="http://za.co.pepkor/product_service/">
   <soapenv:Body>
    <productDetails>
    ----
    </productDetails>
    <productDetails>
    ----
    </productDetails>
</soapenv:Body>
</soapenv:Envelope>

因此您可以将根元素<prod:productSearchResp>添加到具有有效负载工厂介体的soap主体。

<payloadFactory media-type="xml">
        <format>
            <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:prod="http://za.co.pepkor/product_service/">
                <soapenv:Body>
                    <prod:productSearchResp> $1                                                                                                </prod:productSearchResp>
                </soapenv:Body>
            </soapenv:Envelope>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml" expression="//productDetails"/>
        </args>
    </payloadFactory>

不需要第二个聚合并且在其中有负载工厂中介。