跳到主要内容
版本:7.0.2

出站网关

DeepSeek V3 中英对照 Outbound Gateway

出站网关类似于出站适配器和入站适配器的组合:它的作用是处理消息,并使用该消息执行 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 元素仅提供 select 查询。如果您需要通过例如通用网关或负载丰富器主动检索数据,这将非常有用。然后,回复消息将从结果生成(类似于入站适配器的工作方式)并传递到回复通道。以下示例展示了如何使用 query 属性:

<int-jdbc:outbound-gateway
query="select * from foos where id=:headers[id]"
request-channel="input"
reply-channel="output"
data-source="dataSource"/>
important

默认情况下,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 的更多信息,请参阅出站通道适配器