出站网关

出站网关就像出站和入站适配器的组合:它的作用是处理消息并使用它来执行 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"/>

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

<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 开始,update 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"/>

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

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

出站网关需要引用 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 丢弃通道

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