【问题标题】:How to break/stop sequence if exception occurs in mediator using WSO2 ESB如果使用 WSO2 ESB 的中介发生异常,如何中断/停止序列
【发布时间】:2016-09-26 21:15:06
【问题描述】:

我正在尝试实现逻辑,如果在执行序列期间发生任何错误,例如 JMS 端点无效,那么序列应该放在这里并记录消息。

实际的调解如下:

验证-->克隆-->附加日志克隆中介快照。

我的服务代码是:

<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
       name="AdapterService"
       transports="jms"
       statistics="disable"
       trace="disable"
       startOnLoad="true">
   <target>
      <inSequence>
         <log level="full" separator="..... XML Received..."/>
         <validate source="//DOCUMENT03">
            <schema key="conf:/DOCUMENT03_CUSTOM.xsd"/>
            <on-fail>
               <makefault version="pox">
                  <reason value="Invalid XML"/>
                  <detail>Error while validating  XML at  Adapter Service.</detail>
               </makefault>
               <log level="full" category="ERROR" separator="... XML Error..."/>
               <drop/>
            </on-fail>
         </validate>
         <clone>
            <target>
               <sequence>
                  <script language="js">mc.getEnvelope().getBody().getFirstElement().getFirstElement().getFirstElement().detach();</script>
                  <log level="full"/>
                  <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
                  <send>
                     <endpoint>
                        <address uri=**"jms:/BookingMessage?transport.jms.ConnectionFactoryJNDIName=QueueConnectionFactory&amp;java.naming.factory.initial=org.apache.activemq.jndi.ActiveMQInitialContextFactory&amp;java.naming.provider.url=tcp://1929.168.1.113:61616&amp;transport.jms.DestinationType=queue"**
                                 format="pox">
                           <timeout>
                              <duration>10</duration>
                              <responseAction>fault</responseAction>
                           </timeout>
                           <suspendOnFailure>
                              <errorCodes>101507,101505,101503</errorCodes>
                              <progressionFactor>1.0</progressionFactor>
                              <maximumDuration>10</maximumDuration>
                           </suspendOnFailure>
                           <markForSuspension>
                              <errorCodes>101508,101504</errorCodes>
                              <retriesBeforeSuspension>5</retriesBeforeSuspension>
                              <retryDelay>10</retryDelay>
                           </markForSuspension>
                        </address>
                     </endpoint>
                  </send>
                  <payloadFactory media-type="xml">
                     <format>
                        <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
                           <soapenv:Body>$1</soapenv:Body>
                        </soapenv:Envelope>
                     </format>
                     <args>
                        <arg xmlns:tns="http://com.sanomalearning/cdm/finance/generalledger/v1"
                             evaluator="xml"
                             expression="//DOCUMENT03/CMMHeader"/>
                     </args>
                  </payloadFactory>
                  <log level="full"/>
                  <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
                  <send>
                     <endpoint key="conf:/CMMHeaderQueueUrl"/>
                  </send>
                  <log level="full" separator="Message Sent to Queue"/>
               </sequence>
            </target>
         </clone>
      </inSequence>
      <outSequence>
         <send/>
      </outSequence>
      <faultSequence>
         <log level="custom" separator=",">
            <property name="text" value="***FAult Handler***"/>
         </log>
         <property name="SET_ROLLBACK_ONLY" value="true" scope="axis2"/>
         <drop/>
         <log level="custom">
            <property name="text" value="An unexpected error occured"/>
            <property name="message" expression="get-property('ERROR_MESSAGE')"/>
            <property name="code" expression="get-property('ERROR_CODE')"/>
            <property name="detail" expression="get-property('ERROR_DETAIL')"/>
            <property name="exception" expression="get-property('ERROR_EXCEPTION')"/>
         </log>
         <drop/>
      </faultSequence>
   </target>
   <parameter name="transport.jms.ContentType">
      <rules>
         <jmsProperty>contentType</jmsProperty>
         <default>application/xml</default>
      </rules>
   </parameter>
   <parameter name="transport.jms.ConnectionFactory">myQueueConnectionFactory</parameter>
   <parameter name="transport.jms.DestinationType">queue</parameter>
   <parameter name="transport.jms.Destination">AdapterService.01.Request.Queue</parameter>
   <description/>
</proxy>

现在,当我从队列接收请求后执行此服务时,它不是向无效队列发送消息,而是向第二个 Url 发送消息。现在我想如果消息没有发送到无效的端点,那么序列应该被丢弃。无效的网址是粗体。

【问题讨论】:

  • 这不是故障序列的作用吗?
  • 我建议您摆脱克隆中介并尝试相同的方案以确保这不是克隆中介的特殊情况问题。在这里使用克隆中介有什么要求?

标签: jms wso2 wso2esb


【解决方案1】:

AFAIK 您不能在一个克隆中介中的同一目标下定义两个发送中介,而是必须在两个不同目标中定义它们。

如果您能详细说明您的要求,也会有所帮助。对于有关 JMS 端点无效问题的解决方案,您可以做的是在故障序列中定义一个丢弃调解器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 2012-08-31
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多