基于WSO2 ESB代理服务切换OutSequence的SOAP响应

时间:2015-09-14 10:13:23

标签: proxy sequence wso2esb switching mediator

我在WSO2 ESB中部署了一个代理服务,用于从SOAP WS检索数据集,我有一个基于调用模板的序列的OutSequence。

我必须根据不同的请求引导各种WS响应,将它们路由到vfs传输所写的不同文件上。

实际顺序如下:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="seq_prova_con_template">
   <call-template target="file">
      <with-param name="filename" value="IstatAllDataflow-template.xml"></with-param>
   </call-template>
</sequence>

我想到了一个转换案例调解员,但我想了解如何“抓住”选择正确案例的信息。在示例中:

`<switch source="//m0:getQuote/m0:request/m0:symbol"     xmlns:m0="http://services.samples/xsd">
      <case regex="IBM">
           <!-- the property mediator sets a local property on the *current*     message -->
          <property name="symbol" value="Great stock - IBM"/>
      </case>
      <case regex="MSFT">
          <property name="symbol" value="Are you sure? - MSFT"/>
      </case>
      <default>
          <!-- it is possible to assign the result of an XPath or JSON Path     expression as well -->
      <property name="symbol"
            expression="fn:concat('Normal Stock - ', //m0:getQuote/m0:request/m0:symbol)"
            xmlns:m0="http://services.samples/xsd"/>
  </default>

`

我问自己如何设置交换机案例的源参数,我想知道是否有人已经实现了这样的解决方案,以便使用单个代理服务来区分来自WS的各种答案。 我的序列如下:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="seq_template_switch">
   <switch xmlns:ns="http://org.apache.synapse/xsd" xmlns:m0="http://services.samples" source="??????">
      <case regex="QueryStructure">
         <call-template target="file">
            <with-param name="filename" value="IstatAllDataflow-template.xml"></with-param>
         </call-template>
      </case>
      <case regex="GetCompactData">
         <call-template target="file">
            <with-param name="filename" value="GetCompactData-template.xml"></with-param>
         </call-template>
      </case>
   </switch>
</sequence>

我需要在请求消息的请求中从che方法中选择switch case,以便在我要求一种答案时写一个特定的文件,在我问的时候另一个名字不同的文件另一种答案。

[编辑]日志文件包含:

TID: [0] [ESB] [2015-09-18 10:33:09,125]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  To: http://www.w3.org/2005/08/addressing/anonymous, WSAction: , SOAPAction: , MessageID: urn:uuid:7cc540d3-2893-4b0e-8a24-ab4538236d45, Direction: response, Envelope: <?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soap:Body><QueryStructureResponse xmlns="http://ec.europa.eu/eurostat/sri/service/2.0"><QueryStructureResult><RegistryInterface xmlns="http://www.SDMX.org/resources/SDMXML/schemas/v2_0/message"><Header><ID>IT1001</ID><Test>true</Test><Name xml:lang="en">ISTAT_JD_237</Name><Prepared>2001-03-11T15:30:47+01:00</Prepared><Sender id="ISTAT"><Name xml:lang="en">Italian Statistical Institute</Name><Contact>

选择关于标记<QueryStructureResponse>的switch / case mediator是有用的。例如,我可以使用<GetCompactData>代替此标记。我想创建一个开关/案例中介,由这两个标签之一的存在驱动。这将是理解如何使用XPath位置和使用单个序列通过vfs传输区分不同文件中的SOAP答案的良好开端。要写入的文件的选择将取自WS的答案。< / p>

1 个答案:

答案 0 :(得分:1)

下面应该适合你。它正在检查SOAP xml中是否存在QueryStructureResponse。如果可用,则会调用 IstatAllDataflow-template.xml 模板,否则将调用 GetCompactData-template.xml 模板。

<switch source="boolean($body//*[local-name() = 'QueryStructureResponse'])">
        <case regex="true">
           <call-template target="file">
        <with-param name="filename" value="IstatAllDataflow-template.xml"></with-param>
     </call-template>
        </case>
        <case regex="false">
           <call-template target="file">
        <with-param name="filename" value="GetCompactData-template.xml"></with-param>
     </call-template>
        </case>
     </switch>

在WSO2 esb中使用过滤器的另一种解决方案。

<filter source="boolean($body//*[local-name() = 'QueryStructureResponse'])" regex="true">
   <then>
      <log>
         <property name="======================== TRUE =========================" value="true"/>
      </log>
      <call-template target="file">
         <with-param name="filename" value="IstatAllDataflow-template.xml"/>
      </call-template>
   </then>
   <else>
      <log>
         <property name="==================== FALSE =========================" value="false"/>
      </log>
      <call-template target="file">
         <with-param name="filename" value="GetCompactData-template.xml"/>
      </call-template>
   </else>
</filter>