Wso2 Esb序列模板调用端点模板

时间:2015-09-17 21:29:50

标签: templates wso2 wso2esb esb endpoint

我正在尝试实现一个序列模板,该模板使用参数调用端点模板。 我的代码如下:

SEQUENCE -

<sequence xmlns="http://ws.apache.org/ns/synapse" name="aFileWriteSequence" trace="disable">
   <log level="custom">
      <property name="sequence" value="aFileWriteSequence"></property>
   </log>
   <property xmlns:ns="http://org.apache.synapse/xsd" name="filename" expression="get-property('transport', 'FILE_NAME')" scope="default" type="STRING"></property>
   <call-template target="FileWriteTemplate">
      <with-param name="targetFileName" value="A_TITLE"></with-param>
      <with-param name="addressUri" value="vfs:file:///var/process/ren/rrout"></with-param>
   </call-template>
</sequence>

SEQUENCE TEMPLATE -

<template xmlns="http://ws.apache.org/ns/synapse" name="FileWriteTemplate">
   <parameter name="targetFileName"></parameter>
   <parameter name="addressUri"></parameter>
   <sequence>
      <log level="custom">
         <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="TARGET_FILE_NAME" expression="$func:targetFileName"></property>
         <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="ADDRESS_URI" expression="$func:addressUri"></property>
      </log>
      <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="transport.vfs.ReplyFileName" expression="fn:concat($func:targetFileName, '-', get-property('SYSTEM_DATE', 'yyMMddHHmmss') , '.xml')" scope="transport" type="STRING"></property>
      <property name="OUT_ONLY" value="true"></property>
      <send>
         <endpoint name="ep" template="FileOutEndpointTemplate" uri="$func:addressUri">
            <axis2ns117:parameter xmlns:axis2ns117="http://ws.apache.org/ns/synapse" name="retries" value="3"></axis2ns117:parameter>
            <axis2ns118:parameter xmlns:axis2ns118="http://ws.apache.org/ns/synapse" name="codes" value="1001"></axis2ns118:parameter>
            <axis2ns119:parameter xmlns:axis2ns119="http://ws.apache.org/ns/synapse" name="factor" value="1.0"></axis2ns119:parameter>
         </endpoint>
      </send>
   </sequence>
</template>

终点模板 -

<template xmlns="http://ws.apache.org/ns/synapse" name="FileOutEndpointTemplate">
   <axis2ns131:parameter xmlns:axis2ns131="http://ws.apache.org/ns/synapse" name="codes"></axis2ns131:parameter>
   <axis2ns132:parameter xmlns:axis2ns132="http://ws.apache.org/ns/synapse" name="factor"></axis2ns132:parameter>
   <axis2ns133:parameter xmlns:axis2ns133="http://ws.apache.org/ns/synapse" name="retries"></axis2ns133:parameter>
   <endpoint name="$name">
      <address uri="$uri">
         <suspendOnFailure>
            <errorCodes>$codes</errorCodes>
            <progressionFactor>$factor</progressionFactor>
         </suspendOnFailure>
         <markForSuspension>
            <retriesBeforeSuspension>$retries</retriesBeforeSuspension>
            <retryDelay>0</retryDelay>
         </markForSuspension>
      </address>
   </endpoint>
</template>

我在$ Uri上尝试了几种变体,我无法让它工作。从本质上讲,这是我得到的错误:

2015-09-17 16:23:31,026 [-] [SynapseWorker-19] ERROR ClientUtils The system cannot infer the transport information from the $func:addressUri URL.
2015-09-17 16:23:31,026 [-] [SynapseWorker-19] ERROR Axis2Sender Unexpected error during sending message out
org.apache.axis2.AxisFault: The system cannot infer the transport information from the $func:addressUri URL.

我很感激任何人都需要配置此行的建议:

<endpoint name="ep" template="FileOutEndpointTemplate" uri="$func:addressUri">

特别是如何编码从我的序列中的序列模板调用传入的参数 addressUri

1 个答案:

答案 0 :(得分:3)

地址端点不支持动态端点。因此,您无法将动态值($func:addressUri是动态的)传递给模板端点的uri参数。因此,如果您想拥有一个动态端点,那么您可以使用默认端点以及可以动态设置的“To”标头。以下是您的工件的更改。

  1. 您的序列没有变化
  2. 在发送中介之前的序列模板中使用标头中介设置To标头,如下所示。
  3. <template xmlns="http://ws.apache.org/ns/synapse" name="FileWriteTemplate">
       <parameter name="targetFileName"></parameter>
       <parameter name="addressUri"></parameter>
       <sequence>
          <log level="custom">
             <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="TARGET_FILE_NAME" expression="$func:targetFileName"></property>
             <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="ADDRESS_URI" expression="$func:addressUri"></property>
          </log>
          <property xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" name="transport.vfs.ReplyFileName" expression="fn:concat($func:targetFileName, '-', get-property('SYSTEM_DATE', 'yyMMddHHmmss') , '.xml')" scope="transport" type="STRING"></property>
          <property name="OUT_ONLY" value="true"></property>
          <header name="To"  expression="$func:addressUri"/> 
          <send>
             <endpoint name="ep" template="FileOutEndpointTemplate">
                <axis2ns117:parameter xmlns:axis2ns117="http://ws.apache.org/ns/synapse" name="retries" value="3"></axis2ns117:parameter>
                <axis2ns118:parameter xmlns:axis2ns118="http://ws.apache.org/ns/synapse" name="codes" value="1001"></axis2ns118:parameter>
                <axis2ns119:parameter xmlns:axis2ns119="http://ws.apache.org/ns/synapse" name="factor" value="1.0"></axis2ns119:parameter>
             </endpoint>
          </send>
       </sequence>
    </template>
    
    1. 将端点模板中的地址端点更改为默认端点,如下所示
    2. <template xmlns="http://ws.apache.org/ns/synapse" name="FileOutEndpointTemplate">
         <axis2ns131:parameter xmlns:axis2ns131="http://ws.apache.org/ns/synapse" name="codes"></axis2ns131:parameter>
         <axis2ns132:parameter xmlns:axis2ns132="http://ws.apache.org/ns/synapse" name="factor"></axis2ns132:parameter>
         <axis2ns133:parameter xmlns:axis2ns133="http://ws.apache.org/ns/synapse" name="retries"></axis2ns133:parameter>
         <endpoint name="$name">
            <default>
               <suspendOnFailure>
                  <errorCodes>$codes</errorCodes>
                  <progressionFactor>$factor</progressionFactor>
               </suspendOnFailure>
               <markForSuspension>
                  <retriesBeforeSuspension>$retries</retriesBeforeSuspension>
                  <retryDelay>0</retryDelay>
               </markForSuspension>
            </default>
         </endpoint>
      </template>
      

      此解决方案背后的想法是您可以动态设置To标头,默认端点会将消息发送到“To”标头中的端点。

      有关详细信息,请参阅this

      1