0

我正在尝试创建一个事务单元,它发送一个 RESTful HTTP 帖子并将这些数据插入到一个表中。

虽然我有一个本地序列的 onError 处理程序,但当我禁用到我的端点的连接时,而不是失败的“发送”中介将端点置于暂停状态。然后它继续跳过发送,只插入数据。此外,我的自定义 failureSequence 抱怨我不在事务中,即使它是在我调用“之后”调用的<transaction action="new"/>

虽然我已阅读文档并了解进入 SUSPEND 是失败端点的默认行为,但我实际上想要更多控制权。我想在失败(或收到某些特定的 HTTP 响应代码)时触发我自己的序列并调用<transaction action="rollback"/>

为清楚起见,我的序列的相关部分如下所示:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="csvToDatabaseRollback">
   <log level="custom">
      <property name="text" value="Rolling back transaction"/>
   </log>
   <transaction action="rollback"/>
   <!-- rollback any other state, here -->
</sequence>

<sequence xmlns="http://ws.apache.org/ns/synapse" name="csvRow2Pc" onError="csvToDatabaseRollback">
   <transaction action="new"/>
   <log level="full">
      <property name="State" value="Iteration"/>
   </log>
   <property name="HTTP_METHOD" value="POST" scope="axis2" type="STRING"/>
   <log level="custom">
      <property name="text" value="Calling rest-endpoint"/>
   </log>
   <send>
      <endpoint>
         <address uri="http://localhost:80/spotify" format="pox"/>
      </endpoint>
   </send>
   <log level="custom">
      <property name="text" value="After HTTP POST"/>
   </log>
   <dbreport useTransaction="true">
      <connection>
        ....
      </connection>
      <statement>
         <sql>
            <![CDATA[   insert into file values (?, ?, ?)]]></sql>                                                                                                                                                                                                                                 
            <parameter xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" xmlns:sec="http://secservice.samples.esb.wso2.org" expression="//line/col_one/text()" type="VARCHAR"/>
            <parameter xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" xmlns:sec="http://secservice.samples.esb.wso2.org" expression="//line/col_two/text()" type="VARCHAR"/>
            <parameter xmlns:ns2="http://org.apache.synapse/xsd" xmlns:ns="http://org.apache.synapse/xsd" xmlns:sec="http://secservice.samples.esb.wso2.org" expression="//line/col_three/text()" type="VARCHAR"/>
         </statement>
      </dbreport>
      <log level="custom">
         <property name="text" value="Before tx commit"/>
      </log>
      <transaction action="commit"/>
</sequence>

日志包含:

[2013-10-25 15:09:40,117]  WARN - ConnectCallback Connection refused or failed for :   localhost/127.0.0.1:80
[2013-10-25 15:09:40,116]  INFO - LogMediator text = After HTTP POST
[2013-10-25 15:09:40,129]  INFO - LogMediator text = Rolling back transaction
[2013-10-25 15:09:40,129]  WARN - EndpointContext Suspending endpoint :   endpoint_f2e0b5550f82db317194145cb24b59f38a63ab610d8a994c - last suspend duration was :   30000ms and current suspend duration is : 30000ms - Next retry after : Fri Oct 25 15:10:10 NZDT 2013
[2013-10-25 15:09:40,121]  INFO - LogMediator text = Before tx commit
[2013-10-25 15:09:40,131]  INFO - LogMediator text = Rolling back transaction
[2013-10-25 15:09:40,131] ERROR - TransactionMediator Unable to rollback transaction
java.lang.IllegalStateException: This method needs a transaction for the calling thread    and none exists.
Possible causes: either you didn't start a transaction,
it rolledback due to timeout, or it was committed already.
ACTIONS: You can try one of the following: 
1. Make sure you started a transaction for the thread.

如果我检查数据库,行已被提交。随后的尝试将愉快地跳过“发送”中介,因为它已暂停。

理想情况下,我想发送 HTTP POST 并具有基于 REST 响应的自定义路由规则,而不是暂停。我怎样才能做到这一点?

4

1 回答 1

0

当端点挂起时esb会调用faultsequence。在故障序列中,您可以调用任何序列。因此,它使您可以控制放置您的自定义代码。

于 2013-10-25T04:59:45.850 回答