出站网关

出站网关就像出站和入站适配器的组合:它的作用是处理消息并使用它来执行 SQL 查询,然后通过将其发送到回复通道来响应结果。 默认情况下,消息有效负载和标头可用作查询的输入参数,如下例所示:spring-doc.cadn.net.cn

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

前面示例的结果是将一条记录插入到mythingstable 并返回一条消息,指示受影响的行数(有效负载是一个 Map:{UPDATED=1}) 拖动到 output channel 。spring-doc.cadn.net.cn

如果更新查询是带有自动生成的键的插入,则可以通过在keys-generated="true"添加到前面的示例(这不是默认值,因为某些数据库平台不支持它)。 以下示例显示了更改后的配置:spring-doc.cadn.net.cn

<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 查询来执行并从结果(例如入站适配器)生成回复消息,如下例所示:spring-doc.cadn.net.cn

<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属性:spring-doc.cadn.net.cn

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

默认情况下,SELECTquery 仅返回游标中的一行(第一行)。 您可以使用max-rows选择。 如果需要返回 SELECT 中的所有行,请考虑指定max-rows="0".spring-doc.cadn.net.cn

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

出站网关需要引用DataSourceJdbcTemplate. 它还可以具有SqlParameterSourceFactoryinjected 来控制传入消息与查询的绑定。spring-doc.cadn.net.cn

从版本 4.2 开始,request-prepared-statement-setter属性在<int-jdbc:outbound-gateway>作为request-sql-parameter-source-factory. 它允许您指定一个MessagePreparedStatementSetterBean 引用,它实现了更复杂的PreparedStatement执行前的准备工作。spring-doc.cadn.net.cn

从版本 6.0 开始,JdbcOutboundGateway按原样返回空列表结果,而不是将其转换为null和以前一样,意思是 “没有回答”。 这会导致在处理空列表是 downstream logic一部分的应用程序中进行额外的配置。 请参阅 Splitter Discard Channel 了解可能的空列表处理选项。spring-doc.cadn.net.cn

请参阅 出站通道适配器 以了解有关MessagePreparedStatementSetter.spring-doc.cadn.net.cn