|
对于最新稳定版本,请使用 Spring Integration 7.0.0! |
入站通道适配器
入站通道适配器的主要功能是执行 SQL选择查询并将结果集转换为消息。
消息有效载荷是整个结果集(表示为列表),列表中项目的类型取决于行映射策略。
默认策略是一个通用映射器,返回地图对于查询结果中的每一行。
你也可以选择通过添加对行图仪实例(有关行映射的更详细信息,请参见 Spring JDBC 文档)。
如果你想转换选择查询结果到单个消息时,你可以使用下游分流器。 |
入站适配器还需要引用Jdbc模板实例或数据来源.
以及选择为了生成消息,适配器还具有更新该语句标记记录为处理中,使其不会出现在下一次轮询中。
更新可以通过原始选择中的ID列表进行参数化。
默认情况下,这通过命名规范实现(输入结果集中的列,称为身份证在更新的参数映射中转换为一个列表,称为身份证).
以下示例定义了一个带有更新查询和数据来源参考。
<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 的底层功能限制了可用的表达式(例如,除了句号外的大多数特殊字符都不允许),但由于目标通常是可通过豆路径寻址的对象列表(可能是单个对象的列表),因此这并不过于限制。 |
要更改参数生成策略,可以注入SqlParameterSourceFactory进入适配器以覆盖默认行为(适配器具有SQL-参数-源-工厂属性)。
Spring Integration 提供ExpressionEvaluatingSqlParameterSourceFactory创建基于SpEL的参数源,查询结果为#root对象。
(如果每行更新为真,根对象是行)。
如果相同参数名称在更新查询中多次出现,则只计算一次,结果会被缓存。
你也可以用参数源来做选择查询。 在这种情况下,由于没有“结果”对象可供评估,每次都使用单一参数源(而非使用参数源工厂)。 从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" />
这值每个参数表达式中都可以是任何有效的SpEL表达式。
这#root表达式评估的对象是定义在参数源豆。
对于所有评估都是静态的(在前述示例中,空值)字符串).
从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工厂方法。
否则,参数源会缓存评估结果。
还要注意,由于缓存被禁用,如果同一参数名称多次出现在 select 查询中,每次都会重新评估。 |
民调与交易
入站适配器接受普通的 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的常见做法一样,它可以被定义为顶层豆子。 |
在前述示例中,数据库每1000毫秒(或每秒一次)轮询一次,更新和选择查询在同一事务中执行。 事务管理器配置未显示。 然而,只要它知道数据源,轮询就是事务性的。 一个常见的用例是将下游通道设置为直接通道(默认),这样端点在同一线程中被调用,从而实现同一事务。 这样,如果其中任何一个失败,事务会回滚,输入数据会恢复到原始状态。
最大行数对每轮询最大消息数
JDBC入站通道适配器定义了一个属性,称为最大行数.
当你指定适配器的轮询器时,还可以定义一个名为每轮询最大消息数.
虽然这两个属性看起来相似,但它们的含义却截然不同。
每轮询最大消息数指定每个轮询间隔内查询执行次数,而最大行数指定每次执行返回的行数。
在正常情况下,你很可能不想设置轮询器每轮询最大消息数当你使用 JDBC 入站通道适配器时,属性。
其默认值为1,这意味着JDBC的入站通道适配器接收()每个轮询间隔只执行一次方法。
设置每轮询最大消息数属性到更大的值意味着查询连续执行了同样多次。
欲了解更多关于每轮询最大消息数属性,参见配置入站通道适配器。
相比之下,最大行数属性,如果大于0,指定了由接收()方法。
如果属性被设置为0,所有行都包含在最终消息中。
该属性默认为0.
建议通过厂商特定的查询选项(例如 MySQL)使用结果集限制限制或 SQL Server返回页首或者说是神谕者的罗纳姆.
更多信息请参见特定提供商文档。 |