出站閘道器
出站閘道器類似於出站和入站介面卡的組合:它的作用是處理訊息並用它來執行 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"/>
|
預設情況下,`SELECT` 查詢元件只返回遊標中的一行(第一行)。您可以使用 `max-rows` 選項調整此行為。如果您需要返回 SELECT 中的所有行,請考慮指定 `max-rows="0"`。 |
與通道介面卡一樣,您還可以為請求和回覆提供 `SqlParameterSourceFactory` 例項。預設值與出站介面卡相同,因此請求訊息作為表示式的根可用。如果 `keys-generated="true"`,表示式的根是生成的鍵(如果只有一個,則為對映;如果多值,則為對映列表)。
出站閘道器需要引用 `DataSource` 或 `JdbcTemplate`。它還可以注入 `SqlParameterSourceFactory` 來控制傳入訊息與查詢的繫結。
從版本 4.2 開始,`
從版本 6.0 開始,`JdbcOutboundGateway` 返回的空列表結果將按原樣返回,而不是像以前那樣將其轉換為 `null`,這意味著“無回覆”。這導致在處理空列表是下游邏輯一部分的應用程式中需要額外的配置。有關可能的空列表處理選項,請參閱拆分器丟棄通道。
有關 `MessagePreparedStatementSetter` 的更多資訊,請參閱出站通道介面卡。