如何在驼峰路由中回滚事务

时间:2015-02-07 07:20:38

标签: apache-camel

当我在Impl类中抛出RuntimeException时,事务不会被回滚。但是当我在Impl类中取消注释update语句并在路由中注释update语句代码时 交易被回滚。

如何在实现类抛出异常时回滚在路由中写入的更新语句。

<camelContext xmlns="http://camel.apache.org/schema/spring">
<route id="wsRoute">    
<from uri="cxf:bean:paymentServiceEndpoint"/>

<transacted />
 <split streaming="true" parallelProcessing="true"> 
   <simple>${in.body[0]}</simple> 
     <setHeader headerName="bank">
        <simple>${body.bank}</simple>
     </setHeader>
     <log message="The header value is ${header.bank}" />

     <setBody>
        <constant>
                UPDATE TEST 
                SET RECEIVED_BY = 'Y' 
                  WHERE ID = :?bank
        </constant>
      </setBody>
        <to uri="jdbc:dataSource?useHeadersAsParameters=true" /> 

 </split> 
 <bean ref="paymentServiceImpl" />
  <log message="response = ${body}"/>
</route>
</camelContext>

@Transactional(value="txManager", propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public TransferResponse transfer(TransferRequest request) {
    System.out.println("***********PaymentServiceImpl..." + request.getFrom());
    /*
     final int updated= jdbc.update("update TEST set RECEIVED_BY = 'Y' where ID = ?", 
             "abc" );
     */
    TransferResponse response = new TransferResponse();

    if(true)
    throw new RuntimeException("update exception");

    response.setReply("OK");
    System.out.println("***********PaymentServiceImpl.." + response.getReply());
    return response;
}

1 个答案:

答案 0 :(得分:1)

您不能对事务使用并行处理,因为事务的工作单元必须由同一个线程完成,事务管理器需要该线程才能正确编排。所以关掉它。