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>

如您所见,我们重命名原始入站文件,将文件放入不同的目录,具体取决于关联的事务是提交还是回滚。 (可选)可以使用 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 社区中所有即将举行的活动。

查看全部