此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Integration 6.5.1! |
出站网关
出站网关就像出站适配器和入站适配器的组合:它的作用是处理消息并使用它来执行 SQL 查询,然后通过将其发送到回复通道来响应结果。 默认情况下,消息有效负载和标头可用作查询的输入参数,如以下示例所示:
<int-jdbc:outbound-gateway
update="insert into mythings (id, status, name) values (:headers[id], 0, :payload[thing])"
request-channel="input" reply-channel="output" data-source="dataSource" />
前面示例的结果是将一条记录插入到mythings
表,并返回一条消息,指示受影响的行数(有效负载是映射:{UPDATED=1}
) 到输出通道。
如果更新查询是具有自动生成键的插入,则可以通过添加keys-generated="true"
到前面的示例(这不是默认值,因为某些数据库平台不支持它)。
以下示例显示了更改的配置:
<int-jdbc:outbound-gateway
update="insert into mythings (status, name) values (0, :payload[thing])"
request-channel="input" reply-channel="output" data-source="dataSource"
keys-generated="true"/>
您还可以提供选择查询来执行并从结果(例如入站适配器)生成回复消息,而不是更新计数或生成的键,如以下示例所示:
<int-jdbc:outbound-gateway
update="insert into foos (id, status, name) values (:headers[id], 0, :payload[foo])"
query="select * from foos where id=:headers[$id]"
request-channel="input" reply-channel="output" data-source="dataSource"/>
从 Spring Integration 2.2 开始,更新 SQL 查询不再是强制性的。
现在,您只能提供选择查询,方法是使用query
属性或query
元素。
如果您需要使用通用网关或有效负载扩充器等方式主动检索数据,这将非常有用。
然后,根据结果生成回复消息(类似于入站适配器的工作方式)并传递给回复通道。
以下示例显示如何使用query
属性:
<int-jdbc:outbound-gateway
query="select * from foos where id=:headers[id]"
request-channel="input"
reply-channel="output"
data-source="dataSource"/>
默认情况下,组件的 |
与通道适配器一样,您还可以提供SqlParameterSourceFactory
请求和回复的实例。
默认值与出站适配器相同,因此请求消息可用作表达式的根。
如果keys-generated="true"
,表达式的根是生成的键(如果只有一个,则为映射,如果为多值,则为映射列表)。
出站网关需要引用DataSource
或JdbcTemplate
.
它还可以有一个SqlParameterSourceFactory
inject 以控制传入消息与查询的绑定。
从 4.2 版本开始,request-prepared-statement-setter
属性在<int-jdbc:outbound-gateway>
作为替代方案request-sql-parameter-source-factory
.
它允许您指定一个MessagePreparedStatementSetter
bean 引用,它实现了更复杂的PreparedStatement
执行前的准备工作。
从 6.0 版开始,JdbcOutboundGateway
按原样返回空列表结果,而不是将其转换为null
和以前一样,意思是“没有回复”。
这导致在处理空列表是下游逻辑一部分的应用程序中进行额外的配置。
请参阅拆分器丢弃通道,了解可能的空列表处理选项。
有关以下详细信息,请参阅出站通道适配器MessagePreparedStatementSetter
.