出站网关
出站网关类似于出站和入站适配器的组合:它的作用是处理消息并使用它来执行 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"/>
默认情况下, |
与通道适配器一样,您还可以为请求和回复提供SqlParameterSourceFactory
实例。默认值与出站适配器相同,因此请求消息可用作表达式的根。如果keys-generated="true"
,则表达式的根是生成的键(如果只有一个,则为映射;如果有多个值,则为映射列表)。
出站网关需要引用DataSource
或JdbcTemplate
。它还可以注入SqlParameterSourceFactory
来控制传入消息到查询的绑定。
从 4.2 版本开始,request-prepared-statement-setter
属性在<int-jdbc:outbound-gateway>
上可用,作为request-sql-parameter-source-factory
的替代方案。它允许您指定MessagePreparedStatementSetter
bean 引用,该引用在执行之前实现更复杂的PreparedStatement
准备。
从 6.0 版本开始,JdbcOutboundGateway
按原样返回空列表结果,而不是像以前那样将其转换为null
,其含义为“无回复”。这导致在将空列表处理作为下游逻辑一部分的应用程序中需要额外的配置。有关可能的空列表处理选项,请参阅拆分器丢弃通道。
有关MessagePreparedStatementSetter
的更多信息,请参阅出站通道适配器。