|
此版本仍在开发中,尚未被视为稳定版。如需最新稳定版本,请使用 Spring Integration 7.0.4! |
出站网关
出站网关类似于出站和入站适配器的组合:它的角色是处理消息,并使用该消息执行 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})。
如果更新查询是一个带有自动生成键的插入操作,您可以通过在 preceding example 中添加 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 查询不再强制要求。
您现在可以仅提供一个选择(SELECT)查询,通过设置 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 来控制将传入消息绑定到查询的过程。
从 4.2 版本开始,request-prepared-statement-setter 属性可作为 request-sql-parameter-source-factory 的替代选项,在 <int-jdbc:outbound-gateway> 上使用。
它允许您指定一个 MessagePreparedStatementSetter bean 引用,该引用会在执行前进行更复杂的 PreparedStatement 准备。
从版本 6.0 开始,JdbcOutboundGateway 将直接返回空列表结果,而不再像以前那样将其转换为 null(其含义为“无回复”)。
这导致在处理空列表是下游逻辑一部分的应用程序中需要额外的配置。
请参阅 Splitter Discard Channel 以了解可能的空列表处理选项。
有关MessagePreparedStatementSetter的更多信息,请参阅出站通道适配器。