出站网关
出站网关类似于出站和入站适配器的组合:它的作用是处理消息并使用它执行 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"/>
默认情况下,SELECT
查询的组件仅从游标返回一行(第一行)。
您可以使用 max-rows
选项调整此行为。
如果您需要从 SELECT 返回所有行,请考虑指定 max-rows="0"
。
与通道适配器一样,您还可以为请求和回复提供 SqlParameterSourceFactory
实例。
默认值与出站适配器相同,因此请求消息作为表达式的根可用。
如果 keys-generated="true"
,则表达式的根是生成的键(如果只有一个则为映射,如果是多值则为映射列表)。
出站网关需要引用 DataSource
或 JdbcTemplate
。
它还可以注入 SqlParameterSourceFactory
来控制传入消息与查询的绑定。
从版本 4.2 开始,<int-jdbc:outbound-gateway>
上提供了 request-prepared-statement-setter
属性,作为 request-sql-parameter-source-factory
的替代方案。
它允许您指定 MessagePreparedStatementSetter
bean 引用,该引用在执行之前实现更复杂的 PreparedStatement
准备。
从版本 6.0 开始,JdbcOutboundGateway
按原样返回空列表结果,而不是像以前那样将其转换为 null
,这意味着“无回复”。
这导致在处理空列表是下游逻辑一部分的应用程序中需要额外的配置。
有关可能的空列表处理选项,请参阅 拆分器丢弃通道。
有关 MessagePreparedStatementSetter
的更多信息,请参阅 出站通道适配器。