繁体   English   中英

以IBM MQ和Oracle为资源的独立spring app XA事务

[英]Standalone spring app XA transactions with IBM MQ and Oracle as resources

我正在开发一个独立的Apache骆驼应用程序(不在J2EE容器上运行)。 此应用程序必须能够在分布式事务中将消息从IBM MQ队列管理器路由到Oracle数据库。 我的Google搜索几乎将我带到了几个地方,但是没有一个能够给我一些有关如何将所有内容组合在一起的线索。 下面的链接最接近我需要的链接,但不幸的是,它不够聪明,无法让我走上正确的道路。

IBM MQManager作为带有Spring-jms和Spring-tx的XA事务管理器

预先感谢您的输入。

您将需要使用JTA TransactionManager,但由于不在j2ee容器中,因此我建议使用Atomikos。

https://github.com/camelinaction/camelinaction/tree/master/chapter9/xa

我的路由在J2EE中与IBM MQ-> Oracle Database一起使用,是的,但仍应与Atomikos设置一起使用。 我会说这不是实现此目标的正确方法,但这是我设法使其正常工作的唯一方法-对于我的用例而言,工作足够好。

from(inQueue)
    .transacted()
    .setHeader("storeData", constant(false))
    .to("direct:a")
    .choice().when(header("storeData").isEqualTo(false)) // if this is true the database calls are 'successful'
    .log("Sending message to errorQueue")
    .to(errorQueue)
;

StoreDataBean storeDataBean = new StoreDataBean();
from("direct:a")
    .onException(Exception.class).handled(false).log("Rollbacking database changes").markRollbackOnlyLast().end()
    .transacted("PROPAGATION_REQUIRES_NEW")
    .bean(storeDataBean) //storeData sets the header storeData to true if no SQLException or other exceptions are thrown
    .end()
;

提交由事务管理器处理,因此,如果我实际上在数据库提交中遇到错误,则应回滚该消息。 回滚消息遇到的下一个问题是,无法像使用ActiveMQ一样设置deadLetterQueue。 因此它回滚到传入队列。 因此,我实际上像处理数据库事务一样,它是在新事务中进行的,在调用数据库时,如果发生正常的SQLException,则会回滚该事务。

我希望这能奏效:

from(inQueue)
    .onException(Exception.class).to(errorQueue).markRollbackOnly().end()
    .bean(storeDataBean)
    .end()

我已经在社区论坛上发布了有关此内容的信息,但根本没有任何答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM