輸出閘道

輸出閘道就像輸出和輸入配接器的組合:其作用是處理訊息並使用它來執行 SQL 查詢,然後將結果傳送到回覆通道以回應。預設情況下,訊息 Payload 和標頭可用作查詢的輸入參數,如下列範例所示

<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 表格,並傳回一則訊息,指出受影響的列數(Payload 是一個 Map:{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 以來,更新 SQL 查詢不再是強制性的。您現在可以僅提供一個 select 查詢,使用 query 屬性或 query 元素。如果您需要主動檢索資料,例如使用通用閘道或 Payload 豐富器,這非常有用。然後,回覆訊息會從結果產生(類似於輸入配接器的工作方式)並傳遞到回覆通道。以下範例顯示如何使用 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,以前的 null 意味著「沒有回覆」。這在應用程式中造成額外的設定,在這些應用程式中,空的列表的處理是下游邏輯的一部分。有關可能的空列表處理選項,請參閱 分割器捨棄通道

有關 MessagePreparedStatementSetter 的更多資訊,請參閱 輸出通道配接器