出站閘道器

出站閘道器就像出站和入站介面卡的組合:它的作用是處理訊息並使用它來執行 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 的更多資訊,請參閱 出站通道介面卡