Spring Integration 2.2 新特性 (第二部分 - 事务同步)

工程 | Gary Russell | 2012年9月26日 | ...

简介

这是博客文章系列的第二部分,重点介绍了 Spring Integration 2.2 中的一些新特性,这些特性是在最近发布的 候选版本 1 之后提供的。 第一部分 讨论了 MongoDB 适配器。

Spring Integration 2.2 引入了对将非事务性资源与事务同步的扩展支持。

背景

多年来,Spring 一直提供 对将资源与事务同步的一流支持。在许多情况下,此功能用于同步由多个事务管理器管理的事务,以便实现 Dave Syer 在其优秀的 JavaWorld 文章 中描述的“尽力而为 1PC”模式。

例如,它通常用于同步 JMS 提交与 JDBC 提交。

Spring Integration 长期以来一直支持此功能,方法是在轮询器上定义一个 <transactional/> 元素。此版本将此功能更进一步,允许将非事务性资源与事务同步。

例如,考虑一个 <file:inbound-channel-adapter/> 和一个集成应用程序,该应用程序在文件出现在目录中时读取文件,并更新数据库。此功能允许我们配置在事务提交或回滚时要采取的不同操作。

我们还将展示如何配置这些“后处理”操作以发生,即使没有涉及真正的交易资源。

注意事项

此功能不会使固有的非事务性资源(例如简单的文件系统)成为事务性资源;相反,它只是允许我们将文件系统(或其他)活动与事务同步。

内部机制

Spring 事务同步功能的基本组件是一个实现 TransactionSynchronization 的对象。这样的对象具有一些回调函数,框架在同步期间调用这些回调函数(例如 afterCommitafterRollback)。

Spring Integration 2.2 引入了 TransactionSynchronizationFactory 的概念。此工厂负责为每个消息创建一个 TransactionSynchronization 对象。提供了一个默认实现,允许在事务同步期间对消息执行 SpEL 表达式。

配置

让我们继续使用文件系统示例。为了启用事务同步,我们只需在 <transactional/> 元素上添加对 TransactionSynchronizationFactory 的引用,并定义一个工厂以及我们希望在事务同步期间计算的 SpEL 表达式。

<int-file:inbound-channel-adaper ...>
    <poller fixed-rate="1000">
        <transactional synchronization-factory="syncFactory"/>
    </poller>
</int-file:inbound-channel-adapter>

<int:transaction-synchronization-factory id="syncFactory">
	<int:after-commit expression="payload.renameTo('/successful/' + payload.name" />
	<int:after-rollback expression="payload.renameTo('/failed'/ + payload.name" />
</int:transaction-synchronization-factory>

如您所见,我们重命名了原始输入文件,将文件放入不同的目录中,具体取决于关联的事务是提交还是回滚。可选地,评估的结果可以发送到使用事务同步工厂子元素上的“channel”属性定义的 channel

(注意:“before-commit”元素也可用于影响是否实际完成提交)。

伪事务

如上所示,我们现在有了一种方便的机制来在事务提交之前或之后执行某些操作,或者在事务回滚之后执行某些操作。但是,如果我们的流程根本不涉及事务性资源怎么办?例如:file:inbound-adapter<-poller->transformer->ftp:outbound adapter

假设我们希望根据转换后的文件的 ftp 文件传输成功或失败来重命名输入文件。为了适应这种情况,我们引入了 PseudoTransactionManager。此类实现 PlatformTransactionManager,其唯一目的是允许使用上述同步技术,即使没有涉及真正的交易。只需像以前一样添加 <transactional/> 元素,并为其提供对 PseudoTransactionManager 的引用(或使用默认 bean id“transactionManager”)。

结论

使用 Spring Integration 2.2,用户现在能够在流程完成后(成功或失败)执行适当的操作,通常会影响原始输入源。这可以与某些其他事务性资源上的事务同步,甚至在没有涉及真正事务的情况下。

一个探索这些特性的示例应用程序可在 此处 获取。

获取 Spring 新闻通讯

与 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进步。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部