入站通道适配器

入站通道适配器的主要功能是执行 SQLSELECTquery 并将结果集转换为 message。 消息有效负载是整个结果集(表示为List),并且列表中的项的类型取决于行映射策略。 默认策略是一个通用映射器,它返回一个Map对于查询结果中的每一行。 (可选)您可以通过添加对RowMapper实例(有关行映射的更多详细信息,请参阅 Spring JDBC 文档)。spring-doc.cadn.net.cn

如果要转换SELECTquery result 添加到单个消息中,您可以使用下游拆分器。

入站适配器还需要对JdbcTemplate实例或DataSource.spring-doc.cadn.net.cn

以及SELECT语句来生成消息,则适配器还具有UPDATE将记录标记为已处理的语句,以便它们不会显示在下一次轮询中。 更新可以通过原始 select 中的 ID 列表进行参数化。 默认情况下,这是通过命名约定(输入结果集中名为id将转换为名为id). 以下示例定义了一个入站通道适配器,其中包含一个 update 查询和一个DataSource参考。spring-doc.cadn.net.cn

<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 集成中采用的约定(投影到轮询结果列表)相结合。 Spring 的基础 JDBC 功能限制了可用的表达式(例如,除句点以外的大多数特殊字符都是不允许的),但是由于目标通常是可通过 bean 路径寻址的对象列表(可能是一的列表),因此并没有过度限制。

要更改参数生成策略,您可以注入SqlParameterSourceFactory到适配器中以覆盖默认行为(适配器具有sql-parameter-source-factory属性)。 Spring 集成提供了ExpressionEvaluatingSqlParameterSourceFactory,这将创建一个基于 SPEL 的参数源,并将查询结果作为#root对象。 (如果update-per-row为 true,则根对象为该行)。 如果相同的参数名称在 update 查询中多次出现,则仅计算一次,并缓存其结果。spring-doc.cadn.net.cn

您还可以将参数源用于 select 查询。 在这种情况下,由于没有要评估的 “result” 对象,因此每次都使用单个参数源(而不是使用参数源工厂)。 从版本 4.0 开始,你可以使用 Spring 创建基于 SPEL 的参数源,如下例所示:spring-doc.cadn.net.cn

<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 表达式。 这#rootobject 是parameterSource豆。 对于所有评估,它都是静态的(在前面的示例中,一个空的String).spring-doc.cadn.net.cn

从版本 5.0 开始,您可以提供ExpressionEvaluatingSqlParameterSourceFactorysqlParameterTypes为特定参数指定目标 SQL 类型。spring-doc.cadn.net.cn

以下示例为查询中使用的参数提供了 SQL 类型:spring-doc.cadn.net.cn

<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>
使用createParameterSourceNoCacheFactory 方法。 否则,参数源将缓存计算结果。 另请注意,由于禁用了缓存,因此如果相同的参数名称多次出现在 select 查询中,则会针对每次出现的情况重新评估该名称。

轮询和事务

入站适配器接受常规的 Spring 集成 Poller 作为子元素。 因此,可以控制轮询的频率(以及其他用途)。 用于 JDBC 的 Poller 的一个重要功能是可以选择将 poll作包装在事务中,如下例所示:spring-doc.cadn.net.cn

<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>
如果未显式指定 Poller,则使用默认值。 与 Spring Integration 一样,它可以被定义为顶级 bean)。

在前面的示例中,数据库每 1000 毫秒轮询一次(或每秒轮询一次),并且 update 和 select 查询都在同一事务中执行。 未显示事务管理器配置。 但是,只要它知道数据源,轮询就是事务性的。 一个常见的用例是将 downstream channels 作为 direct channels(默认),以便在同一个线程中调用端点,从而在同一个 transaction 中调用。 这样,如果其中任何一个失败,事务将回滚,并且 Importing 数据将恢复到其原始状态。spring-doc.cadn.net.cn

max-rowsmax-messages-per-poll

JDBC 入站通道适配器定义了一个名为max-rows. 当你指定适配器的 Poller 时,你还可以定义一个名为max-messages-per-poll. 虽然这两个属性看起来相似,但它们的含义却大不相同。spring-doc.cadn.net.cn

max-messages-per-poll指定每个轮询间隔执行查询的次数,而max-rows指定每次执行返回的行数。spring-doc.cadn.net.cn

在正常情况下,您可能不希望将 poller 的max-messages-per-poll属性。 其默认值为1,这意味着 JDBC 入站通道适配器的receive()method 对于每个轮询间隔只执行一次。spring-doc.cadn.net.cn

设置max-messages-per-poll属性设置为更大的值意味着查询将连续执行多次。 有关max-messages-per-poll属性,请参见配置入站通道适配器spring-doc.cadn.net.cn

相比之下,max-rows属性,如果大于0中,指定要从receive()方法。 如果该属性设置为0,则所有行都包含在生成的消息中。 该属性默认为0.spring-doc.cadn.net.cn

建议通过特定于供应商的查询选项(例如 MySQL)使用结果集限制LIMIT或 SQL ServerTOP或 Oracle 的ROWNUM. 有关更多信息,请参阅特定供应商文档。