【问题标题】:WSO2 ESB "Send" mediator not sending to Out Sequence of ProxyWSO2 ESB“发送”调解器不发送到代理的输出序列
【发布时间】:2015-03-10 05:08:43
【问题描述】:

我在 WSO2 Esb 代理服务中创建的 2 个序列有一点问题。

这是我的配置:

我的代理 (Pepkor_Product_Search_Proxy) 需要搜索 Web 服务和数据服务以获取产品信息并返回响应(如果需要,可以聚合)。

我的代理服务调用 2 个服务;托管在 DSS 上的数据服务和托管在 AS 上的 Web 服务。代理请求被发送到 2 个“请求序列”,这些“请求序列”对请求进行格式化,以匹配 AS 和 DSS 上相应服务调用的预期消息。收到响应后,我将它们发送到 2 个“响应序列”,以便根据(根据 WSDL)将它们格式化为代理服务响应。但是,一旦到达这些序列中的发送中介,执行就会停止,并且代理的 Out Sequence 不会接收到它们。

发送中介使用默认行为(应该是发送到代理的序列),例如:

所有 4 个序列(2 Rq + 2Rs)都是动态的并保存在 system_/conf:registry 中

我只从一个服务接收到肥皂中返回的消息(似乎 rs 序列正在响应,而不是代理的 out seq!)

我想知道如何将这些“中介”响应返回到我的代理输出序列中......

我尝试了序列中介而不是克隆,但无济于事。

请看下面:Rq mssg、代理和“响应”序列突触配置以及代理碳日志。

提前致谢,如果您需要任何其他信息,请告诉我。

SOAP 请求:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:prod="http://za.co.pepkor/product_service/">
   <soapenv:Header/>
   <soapenv:Body>
      <prod:productSearchReq>
         <!--Optional:-->
         <productName>NIKE_SHIRTS</productName>
         <!--Optional:-->
         <productSize>7</productSize>
         <!--Optional:-->
         <productColour>RED</productColour>
      </prod:productSearchReq>
   </soapenv:Body>
</soapenv:Envelope>

代理:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse" name="Pepkor_Product_Search_Proxy"
    transports="https http" startOnLoad="true" trace="disable">
    <target>
        <inSequence>
            <log level="custom">
                <property name="Sending request to :"
                    value="ackServiceSearchSeqRq and shcServiceSearchSeqRq sequences..." />
            </log>
            <clone sequential="true">
                <target sequence="conf:/ackServiceSearchSeqRq" />
                <target sequence="conf:/shcServiceSearchSeqRq" />
            </clone>
        </inSequence>
        <outSequence>
            <log level="custom">
                <property name="Out Sequence reached"
                    value="++++++++++++++=========Aggregating now========+++++++++++++++++==" />
            </log>
            <aggregate>
                <completeCondition>
                    <messageCount min="-1" max="-1" />
                </completeCondition>
                <onComplete expression="//productDetails">
                    <log level="custom" separator=",">
                        <property name="::::"
                            value="======================= Sending Back the Aggregated Responses. ===============" />
                    </log>
                </onComplete>
            </aggregate>
            <respond />
        </outSequence>
        <faultSequence />
    </target>
    <publishWSDL key="gov:service_integration/wsdls/PepKorProductSearch.wsdl" />
</proxy>

确认服务 Rs 序列

    <?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="ackServiceSearchSeqRs">
    <log level="custom">
        <property name="Below Response recieved from Ack-WS" value="==================" />
    </log>
    <log level="full" />
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="product_Colour"
        expression="//ns1:productSearchResponse/ns1:return/ax23:product_Colour/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:Colour : "
            expression="$ctx:product_Colour" />
    </log>
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="product_ID"
        expression="//ns1:productSearchResponse/ns1:return/ax23:product_ID/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:ID : "
            expression="$ctx:product_ID" />
    </log>
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="product_Name"
        expression="//ns1:productSearchResponse/ns1:return/ax23:product_Name/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:Name : "
            expression="$ctx:product_Name" />
    </log>
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="product_Size"
        expression="//ns1:productSearchResponse/ns1:return/ax23:product_Size/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:Size : "
            expression="$ctx:product_Size" />
    </log>
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="source"
        expression="//ns1:productSearchResponse/ns1:return/ax23:source/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:Source : "
            expression="$ctx:source" />
    </log>
    <property xmlns:ns1="http://ack.pepkor.org" xmlns:ns="http://org.apache.synapse/xsd"
        xmlns:ax23="http://ack.pepkor.org/xsd" name="type"
        expression="//ns1:productSearchResponse/ns1:return/ax23:type/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="ackRs:Type : "
            expression="$ctx:type" />
    </log>
    <payloadFactory media-type="xml">
        <format>
            <productDetails xmlns:pep="http://za.co.pepkor/product_service/">
                <productID>$1</productID>
                <productName>$2</productName>
                <productSize>$3</productSize>
                <productColour>$4</productColour>
                <productType>$5</productType>
                <sourceID>$6</sourceID>
            </productDetails>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:product_ID" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:product_Name" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:product_Size" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:product_Colour" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:type" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:source" />
        </args>
    </payloadFactory>
    <send />
    </sequence>

Shc 服务 Rs 序列

<?xml version="1.0" encoding="UTF-8"?>
<sequence xmlns="http://ws.apache.org/ns/synapse" name="shcServiceSearchSeqRs">
    <log level="custom">
        <property name="Below response recieved from Shc-DS" value="==================" />
    </log>
    <log level="full" />
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Product_ID" expression="//ns1:productDetails/ns1:Product_ID/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Product_ID : "
            expression="$ctx:Product_ID" />
    </log>
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Product_Name" expression="//ns1:productDetails/ns1:Product_Name/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Product_Name : "
            expression="$ctx:Product_Name" />
    </log>
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Product_Size" expression="//ns1:productDetails/ns1:Product_Size/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Product_Size : "
            expression="$ctx:Product_Size" />
    </log>
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Product_Colour" expression="//ns1:productDetails/ns1:Product_Colour/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Product_Colour : "
            expression="$ctx:Product_Colour" />
    </log>
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Product_Type" expression="//ns1:productDetails/ns1:Product_Type/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Product_Type : "
            expression="$ctx:Product_Type" />
    </log>
    <property xmlns:ns1="SHC" xmlns:ns="http://org.apache.synapse/xsd"
        name="Source" expression="//ns1:productDetails/ns1:Source/text()"
        scope="default" type="STRING" />
    <log level="custom">
        <property xmlns:ns="http://org.apache.synapse/xsd" name="shcRs: Source : "
            expression="$ctx:Source" />
    </log>
    <payloadFactory media-type="xml">
        <format>
            <productDetails xmlns="">
                <productID>$1</productID>
                <productName>$2</productName>
                <productSize>$3</productSize>
                <productColour>$4</productColour>
                <productType>$5</productType>
                <sourceID>$6</sourceID>
            </productDetails>
        </format>
        <args>
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Product_ID" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Product_Name" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Product_Size" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Product_Colour" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Product_Type" />
            <arg xmlns:ns="http://org.apache.synapse/xsd" evaluator="xml"
                expression="$ctx:Source" />
        </args>
    </payloadFactory>
    <send />
</sequence>

SOAP Rs

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <productDetails>
         <productID>214562</productID>
         <productName>NIKE_SHIRTS</productName>
         <productSize>7</productSize>
         <productColour>RED</productColour>
         <productType>SHIRT</productType>
         <sourceID>SHC</sourceID>
      </productDetails>
   </soapenv:Body>
</soapenv:Envelope>

WSO2 碳测井

https : // 文档。谷歌。 com/document/d/12At0zir99H9cOo9hzNrgG33r52PHF0W32XLyBT6dzUQ/编辑? usp=分享


编辑

我的 AggHandlerSequence :

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <log level="custom">
      <property name="pocSearchRsHandlerSeq reached" value="++++++++++++++=========Aggregating now========+++++++++++++++++=="></property>
   </log>
   <aggregate>
      <completeCondition>
         <messageCount min="-1" max="-1"></messageCount>
      </completeCondition>
      <onComplete xmlns:ns="http://org.apache.synapse/xsd" xmlns:prod="http://za.co.pepkor/product_service/" expression="//prod:productSearchResp/productDetails">
         <log level="custom" separator=",">
            <property name="::::" value="======================= Sending Back the Aggregated Responses. ==============="></property>
         </log>
         <respond></respond>
      </onComplete>
   </aggregate>
</sequence>

还有我的一个 Rs Seq

<sequence xmlns="http://ws.apache.org/ns/synapse">
       :
       :
   <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>                  
                  <productDetails xmlns="">                     
                     <productID>$1</productID>                     
                     <productName>$2</productName>                     
                     <productSize>$3</productSize>                     
                     <productColour>$4</productColour>                     
                     <productType>$5</productType>                     
                     <sourceID>$6</sourceID>                  
                  </productDetails>               
               </prod:productSearchResp>            
            </soapenv:Body>         
         </soapenv:Envelope>
     : 
     :
   <sequence key="conf:/pocSearchRsHandlerSeq"></sequence>
     :
     :

但是我在肥皂中得到了这个卢比

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <productDetails>
         <productID>2145627</productID>
         <productName>NIKE_SHIRTS</productName>
         <productSize>7</productSize>
         <productColour>RED</productColour>
         <productType>SHIRT</productType>
         <sourceID>ACK</sourceID>
      </productDetails>
      <productDetails>
         <productID>214562</productID>
         <productName>NIKE_SHIRTS</productName>
         <productSize>7</productSize>
         <productColour>RED</productColour>
         <productType>SHIRT</productType>
         <sourceID>SHC</sourceID>
      </productDetails>
   </soapenv:Body>
</soapenv:Envelope>

然而,我想要一个类似于 Rs seq 中的 Payload 工厂的响应,我尝试过使用 corrolateOn 表达式。我可以将这些聚合字段存储为属性并在有效负载工厂中使用它们吗?或者如何将 Agg 响应映射到?

最终编辑

完美了,这是一个 Rs seq 有效负载:(这将由 agg 处理程序接收)

         <productDetails xmlns="">            
            <productID>$1</productID>            
            <productName>$2</productName>            
            <productSize>$3</productSize>            
            <productColour>$4</productColour>            
            <productType>$5</productType>            
            <sourceID>$6</sourceID>         
         </productDetails>

还有我完整的 agg 处理程序:

<sequence xmlns="http://ws.apache.org/ns/synapse">
   <log level="custom">
      <property name="pocSearchRsHandlerSeq reached" value="++++++++++++++=========Aggregating now========+++++++++++++++++=="></property>
   </log>
   <aggregate>
      <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>
         <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>

【问题讨论】:

    标签: wso2 wso2esb wso2carbon synapse


    【解决方案1】:

    如果您想使用聚合中介,则 2 个响应必须按照您使用此中介的相同顺序进行

    在您的代理 inSequence 中,您使用克隆并调用“ackServiceSearchSeqRq”和“shcServiceSearchSeqRq”

    在每个请求序列中,您根据要调用的服务格式化您的请求,然后通过以下方式之一使用发送调解器:

    • 第一个选项:&lt;send&gt; &lt;endpoint key="xxx"&gt; &lt;/send&gt;:来自您的 2 个服务的 2 个响应将转到您代理的 outSequence
    • 第二个选项:&lt;send receive="MyAggregateSequence"&gt; &lt;endpoint key="xxx"&gt; &lt;/send&gt;:来自您的 2 个服务的 2 个响应将转到“MyAggregateSequence”

    在您代理的 outSequence 或“MyAggregateSequence”中,根据您选择的选项,您使用过滤器或切换中介来确定它是来自 ackService 还是来自 shcService 的响应,并决定应用哪个转换(注意您使用 payloadFactory 创建的 productDetails 节点,如果没有命名空间,则每次都指定 xmlns="" :在您的示例中不是这种情况),然后再调用聚合中介。在 aggregate/onComplete 中,您可以使用没有端点的 send mediator 将您的聚合消息发送回代理的调用者。

    在您的情况下,有 2 个&lt;send/&gt;,在您的 2 个 Rs 序列中的每一个中都有一个:第一个发送给代理的调用者,第二个什么也不做(ESB 必须说您尝试响应 2 次)。

    【讨论】:

    • 欣赏它让-米歇尔,你的回答帮助我理解了这些序列的“顺序性”。我以类似于您所说的方式解决了它,但是我使用了 而不是我的 Rs 序列中的 调解器,并将代理设置为使用它,因为它是出序列,它工作正常。但是,我现在想在 调解器之前格式化响应。请查看上面的编辑...
    • 我正要回答你一个人发现的问题 ;-)
    【解决方案2】:

    使用克隆中介时,如果要收集两条消息的响应,则必须在克隆中介上设置和id,并在聚合中介中使用相同的id

    < clone id="XXX">
    
    < aggregate id="XXX">
    

    这样聚合器就知道它需要等待哪些调用。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2017-03-18
      • 1970-01-01
      • 2015-08-04
      • 1970-01-01
      • 2017-01-11
      • 2013-01-04
      • 2017-02-07
      • 1970-01-01
      相关资源
      最近更新 更多