出站閘道器
出站閘道器就像出站和入站介面卡的組合:它的作用是處理訊息並使用它來執行 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"/>
預設情況下,用於 |
與通道介面卡一樣,您還可以為請求和回覆提供 SqlParameterSourceFactory
例項。預設值與出站介面卡相同,因此請求訊息作為表示式的根可用。如果 keys-generated="true"
,則表示式的根是生成的鍵(如果只有一個,則為 map;如果是多值的,則為 map 列表)。
出站閘道器需要引用 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
。這導致在下游邏輯中處理空列表成為一部分的應用中需要額外的配置。有關可能的空列表處理選項,請參閱 Splitter 丟棄通道。
有關 MessagePreparedStatementSetter
的更多資訊,請參閱 出站通道介面卡。