用于不同操作的WSO2 ESB- PayloadFactory

时间:2016-08-04 10:17:14

标签: wso2 wso2esb

我有一个有多个操作的后端服务。 (例如,echoInt和echoString)。我想用预定义的变量(在inSequence中)用 PayloadFactory 中介替换它们的输入值。 如何为不同的操作定义payloadfactory? 当我为每个人定义两个payloadfactory中介时,只有最后一个中介为它的操作工作。当我调用其他opertaion时,会出现此错误:

wso2 namespace mismatch

operation1:

<p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
  <in>$1</in>
</p:echoString>

操作2:

<p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">      
   <in>$1</in>
</p:echoInt>

我的inSequense:

   <inSequence>
     <payloadFactory media-type="xml">
        <format>
           <p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
              <in xmlns="">teststr</in>
           </p:echoString>
        </format>
        <args/>
     </payloadFactory>
     <payloadFactory media-type="xml">
        <format>
           <p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
              <in xmlns="">1111</in>
           </p:echoInt>
        </format>
        <args/>
     </payloadFactory>
  </inSequence>

以上inSequense,两个操作的输出结果是&#39; 1111&#39;:

 <ns:echoStringResponse xmlns:ns="http://echo.services.core.carbon.wso2.org">
     <return>1111</return>
 </ns:echoStringResponse>

提前致谢

2 个答案:

答案 0 :(得分:0)

第二个Payload工厂取代了第一个。 如果要在不同的情况下使用它们,则应在Switch中介中定义它们。

您可以使用属性来获取定义应使用哪种情况的输入,然后使用正则表达式匹配属性值。或者您可以跳过该属性并在Switch源中输入表达式。

最后它看起来类似于:

<inSequence>
    <property expression="/default/expression" name="input_string" scope="default" type="STRING"/>
    <switch source="get-property('input_string')">
        <case regex="[\w\s]+">
            <payloadFactory media-type="xml">
                <format>
                    <p:echoString xmlns:p="http://echo.services.core.carbon.wso2.org">
                        <in xmlns="">teststr</in>
                    </p:echoString>
                </format>
                <args/>
            </payloadFactory>
        </case>
        <default>
            <payloadFactory media-type="xml">
                <format>
                    <p:echoInt xmlns:p="http://echo.services.core.carbon.wso2.org">
                        <in xmlns="">1111</in>
                    </p:echoInt>
                </format>
                <args/>
            </payloadFactory>
        </default>
    </switch>
    <respond/>
</inSequence>

答案 1 :(得分:0)

如果你想同时调用两个操作,你应该使用克隆或迭代Mediator,并在后面使用聚合Mediator。

你使用两个payloadFactory的原因,只有最后一个工作,是一个请求只有一个消息上下文,这意味着,你只能同时向后端发送一个soap消息。这意味着最后一个payloadFactory将覆盖第一个。

克隆或迭代Mediator会将一个消息上下文克隆或拆分为多个消息上下文,然后您可以向后端服务发送多个soap消息。由于您有多个消息上下文,因此您应该使用聚合Mediator在后端服务返回结果后将这些多个响应聚合到一个消息上下文中。