跳到主要内容

出站网关

QWen Plus 中英对照 Outbound Gateway

outbound 网关就像 outbound 和 inbound 适配器的结合体:它的作用是处理消息并使用它来执行 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" />
xml

前面示例的结果是向 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"/>
xml

除了更新计数或生成的键之外,你还可以提供一个查询语句来执行,并从结果生成回复消息(例如入站适配器),如下例所示:

<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"/>
xml

自从 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"/>
xml
important

默认情况下,SELECT 查询的组件仅返回游标中的一个(第一个)行。你可以使用 max-rows 选项调整此行为。如果你需要返回 SELECT 中的所有行,请考虑指定 max-rows="0"

与通道适配器一样,你也可以为请求和回复提供 SqlParameterSourceFactory 实例。默认值与输出适配器相同,因此请求消息可在表达式的根处使用。如果 keys-generated="true",表达式的根是生成的键(如果只有一个则是映射,如果是多值则是映射列表)。

outbound 网关需要引用 DataSourceJdbcTemplate 之一。它还可以注入 SqlParameterSourceFactory 以控制传入消息与查询的绑定。

从 4.2 版本开始,<int-jdbc:outbound-gateway> 上提供了 request-prepared-statement-setter 属性,作为 request-sql-parameter-source-factory 的替代方案。它允许您指定一个 MessagePreparedStatementSetter bean 引用,在执行之前实现更复杂的 PreparedStatement 准备工作。

从 6.0 版本开始,JdbcOutboundGateway 返回空列表结果,而不是像以前那样将其转换为 null,其含义是“无回复”。这在处理空列表是下游逻辑一部分的应用程序中导致了额外的配置。有关可能的空列表处理选项,请参阅拆分器丢弃通道

有关 MessagePreparedStatementSetter 的更多信息,请参阅 输出通道适配器