輸出閘道
輸出閘道就像輸出和輸入配接器的組合:其作用是處理訊息並使用它來執行 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"/>
預設情況下, |
與通道配接器一樣,您也可以為請求和回覆提供 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
,以前的 null
意味著「沒有回覆」。這在應用程式中造成額外的設定,在這些應用程式中,空的列表的處理是下游邏輯的一部分。有關可能的空列表處理選項,請參閱 分割器捨棄通道。
有關 MessagePreparedStatementSetter
的更多資訊,請參閱 輸出通道配接器。