此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
入站通道适配器
入站通道适配器的主要功能是执行 SQLSELECT
查询并将结果集转换为消息。
消息有效负载是整个结果集(表示为List
),列表中项的类型取决于行映射策略。
默认策略是一个通用映射器,它返回一个Map
查询结果中的每一行。
或者,您可以通过添加对RowMapper
实例(有关行映射的更多详细信息,请参阅 Spring JDBC 文档)。
如果要转换SELECT 查询结果到单个消息时,可以使用下游拆分器。 |
入站适配器还需要引用JdbcTemplate
实例或DataSource
.
以及SELECT
语句来生成消息,则适配器还具有UPDATE
将记录标记为已处理的语句,以便它们不会显示在下一次轮询中。
更新可以通过原始选择中的 ID 列表进行参数化。
默认情况下,这是通过命名约定(输入结果集中名为id
在参数映射中转换为名为id
).
以下示例定义了具有更新查询和DataSource
参考。
<int-jdbc:inbound-channel-adapter query="select * from item where status=2"
channel="target" data-source="dataSource"
update="update item set status=10 where id in (:id)" />
更新查询中的参数用冒号 (: ) 前缀添加到参数的名称(在前面的示例中,该参数是要应用于轮询结果集中的每一行的表达式)。
这是 Spring JDBC 中命名参数 JDBC 支持的标准功能,结合了 Spring Integration 中采用的约定(投影到轮询结果列表)。
底层的 Spring JDBC 功能限制了可用的表达式(例如,不允许使用句点以外的大多数特殊字符),但由于目标通常是可由 bean 路径寻址的对象列表(可能是一个对象的列表),因此这不会受到过度限制。 |
要更改参数生成策略,您可以注入SqlParameterSourceFactory
添加到适配器中以覆盖默认行为(适配器具有sql-parameter-source-factory
属性)。
Spring Integration 提供ExpressionEvaluatingSqlParameterSourceFactory
,它创建一个基于 SpEL 的参数源,查询结果作为#root
对象。
(如果update-per-row
为 true,则根对象是行)。
如果同一参数名称在更新查询中多次出现,则仅计算一次,并缓存其结果。
还可以将参数源用于选择查询。 在这种情况下,由于没有要计算的“结果”对象,因此每次都使用单个参数源(而不是使用参数源工厂)。 从版本 4.0 开始,您可以使用 Spring 创建基于 SpEL 的参数源,如以下示例所示:
<int-jdbc:inbound-channel-adapter query="select * from item where status=:status"
channel="target" data-source="dataSource"
select-sql-parameter-source="parameterSource" />
<bean id="parameterSource" factory-bean="parameterSourceFactory"
factory-method="createParameterSourceNoCache">
<constructor-arg value="" />
</bean>
<bean id="parameterSourceFactory"
class="o.s.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
<property name="parameterExpressions">
<map>
<entry key="status" value="@statusBean.which()" />
</map>
</property>
</bean>
<bean id="statusBean" class="foo.StatusDetermination" />
这value
在每个参数表达式中,可以是任何有效的 SpEL 表达式。
这#root
表达式求值的对象是parameterSource
豆。
对于所有评估,它都是静态的(在前面的示例中,空的String
).
从 5.0 版开始,您可以提供ExpressionEvaluatingSqlParameterSourceFactory
跟sqlParameterTypes
以指定特定参数的目标 SQL 类型。
以下示例为查询中使用的参数提供了 SQL 类型:
<int-jdbc:inbound-channel-adapter query="select * from item where status=:status"
channel="target" data-source="dataSource"
select-sql-parameter-source="parameterSource" />
<bean id="parameterSource" factory-bean="parameterSourceFactory"
factory-method="createParameterSourceNoCache">
<constructor-arg value="" />
</bean>
<bean id="parameterSourceFactory"
class="o.s.integration.jdbc.ExpressionEvaluatingSqlParameterSourceFactory">
<property name="sqlParameterTypes">
<map>
<entry key="status" value="#{ T(java.sql.Types).BINARY}" />
</map>
</property>
</bean>
使用createParameterSourceNoCache 工厂方法。
否则,参数源将缓存评估结果。
另请注意,由于缓存已禁用,因此如果同一参数名称多次出现在选择查询中,则会针对每次匹配项重新计算该参数。 |
轮询和交易
入站适配器接受常规的 Spring Integration 轮询器作为子元素。 因此,可以控制轮询的频率(以及其他用途)。 用于 JDBC 的轮询器的一个重要功能是将轮询作包装在事务中的选项,如以下示例所示:
<int-jdbc:inbound-channel-adapter query="..."
channel="target" data-source="dataSource" update="...">
<int:poller fixed-rate="1000">
<int:transactional/>
</int:poller>
</int-jdbc:inbound-channel-adapter>
如果未显式指定轮询器,则使用默认值。 与 Spring Integration 一样,它可以定义为顶级 bean)。 |
在前面的示例中,数据库每 1000 毫秒(或每秒轮询一次)一次,并且更新和选择查询都在同一事务中执行。 未显示事务管理器配置。 但是,只要它知道数据源,轮询就是事务性的。 一个常见的用例是下游通道是直接通道(默认值),以便端点在同一线程中调用,因此在同一事务中调用。 这样,如果其中任何一个失败,事务将回滚,输入数据将恢复到其原始状态。
max-rows
对max-messages-per-poll
JDBC 入站通道适配器定义了一个名为max-rows
.
指定适配器的轮询器时,还可以定义一个名为max-messages-per-poll
.
虽然这两个属性看起来很相似,但它们的含义却大不相同。
max-messages-per-poll
指定每个轮询间隔执行查询的次数,而max-rows
指定每次执行返回的行数。
在正常情况下,您可能不想将轮询器的max-messages-per-poll
属性。
其默认值为1
,这意味着 JDBC 入站通道适配器的receive()
方法对每个轮询间隔只执行一次。
设置max-messages-per-poll
属性设置为更大的值意味着查询连续执行多次。
有关max-messages-per-poll
属性,请参阅配置入站通道适配器。
相比之下,max-rows
属性,如果大于0
,指定要从由receive()
方法。
如果属性设置为0
,则所有行都包含在生成的消息中。
该属性默认为0
.
建议通过特定于提供商的查询选项(例如 MySQL)使用结果集限制LIMIT 或 SQL ServerTOP 或 Oracle 的ROWNUM .
有关详细信息,请参阅特定提供商文档。 |