领先一步
VMware 提供培训和认证,以加速您的进步。
了解更多Spring Integration 2.2 引入了对将非事务性资源与事务同步的扩展支持。
例如,它通常用于同步 JMS 提交与 JDBC 提交。
Spring Integration 长期以来一直支持此功能,方法是在轮询器上定义一个 <transactional/>
元素。此版本将此功能更进一步,允许将非事务性资源与事务同步。
例如,考虑一个 <file:inbound-channel-adapter/>
和一个集成应用程序,该应用程序在文件出现在目录中时读取文件,并更新数据库。此功能允许我们配置在事务提交或回滚时要采取的不同操作。
我们还将展示如何配置这些“后处理”操作以发生,即使没有涉及真正的交易资源。
此功能不会使固有的非事务性资源(例如简单的文件系统)成为事务性资源;相反,它只是允许我们将文件系统(或其他)活动与事务同步。
Spring 事务同步功能的基本组件是一个实现 TransactionSynchronization
的对象。这样的对象具有一些回调函数,框架在同步期间调用这些回调函数(例如 afterCommit
、afterRollback
)。
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,用户现在能够在流程完成后(成功或失败)执行适当的操作,通常会影响原始输入源。这可以与某些其他事务性资源上的事务同步,甚至在没有涉及真正事务的情况下。
一个探索这些特性的示例应用程序可在 此处 获取。