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 元素仅提供一个选择查询。如果你需要使用通用网关或有效负载增强器等来主动检索数据,这非常有用。然后从结果生成答复消息(类似于入站适配器的工作方式)并将其传递到答复通道。以下示例显示了如何使用 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",表达式的根是生成键(如果只有一个,则为映射;如果多值,则为映射列表)。以下示例显示了更改后的配置:

出站网关需要对 DataSourceJdbcTemplate 的引用。它还可以注入一个 SqlParameterSourceFactory 来控制传入消息与查询的绑定。

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

从 6.0 版本开始,{JdbcOutboundGateway} 返回一个空的列表结果原样,而不是将其转化为 {null},就像以前一样,含义为“无答复”。这导致了在处理空列表是下游逻辑的一部分的应用程序中的额外的配置。有关可能的空列表处理选择,请参见 {Splitter Discard Channel}。

有关 MessagePreparedStatementSetter 的更多信息,请参阅 Outbound Channel Adapter