【问题标题】:How to disregard empty Soap messages that are coming into my Proxy如何忽略进入我的代理的空肥皂消息
【发布时间】:2015-04-27 15:13:38
【问题描述】:

我一直在忙着重构我的序列和代理(参见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了解更多背景信息

【问题讨论】:

    标签: wso2 wso2esb wso2carbon synapse


    【解决方案1】:

    &lt;aggregate id="iT"&gt; 的 onComplete 中,您将拥有聚合的 产品详情如下

    <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>
    

    因此您可以使用有效负载工厂调解器将根元素 &lt;prod:productSearchResp&gt; 添加到肥皂主体。

    <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>
    

    不需要第二个聚合并在其中包含有效负载工厂调解器。

    【讨论】:

    • 不,就像我在上一个问题中所说的那样,Aggregator 节点将在收到来自 Iterator mediator 的 x 条迭代消息后终止,因此将忽略任何其他消息。例如,如果我有 1 个聚合器,正如您所建议的那样,并且此处理程序序列从 Iterator 接收 5 个 mssg,从另一个序列接收另外 1 个,它将在收到 5 条消息而不是 6 条消息后终止(执行 onComplete)。
    • 好的,那么第一个聚合的 得到了什么?
    • 在第二个聚合中,您需要提供最小值和消息计数。因为聚合不与任何迭代调解器一起播放
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多