取得领先
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>
如您所见,我们重命名原始入站文件,将文件放入不同的目录,具体取决于关联的事务是提交还是回滚。 (可选)可以使用 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,用户现在能够在流程完成后(无论是成功还是失败)执行适当的操作,通常会影响原始输入源。 这可以与某些其他事务资源上的事务同步,甚至在没有涉及实际事务的情况下进行同步。
在此处提供了一个探索这些功能的示例应用程序。