2.2 和 3.0 之間的更改
新元件
版本 3.0 增加了一些新元件。
HTTP 請求對映
HTTP 模組現在為入站端點提供了強大的請求對映支援。我們用 IntegrationRequestMappingHandlerMapping 替換了 UriPathHandlerMapping 類,該類以 bean 名稱 integrationRequestMappingHandlerMapping 在應用程式上下文中註冊。解析 HTTP 入站端點時,會註冊一個新的 IntegrationRequestMappingHandlerMapping bean 或重用一個現有 bean。為了實現靈活的請求對映配置,Spring Integration 為 <http:inbound-channel-adapter/> 和 <http:inbound-gateway/> 提供了 <request-mapping/> 子元素。現在,這兩個 HTTP 入站端點完全基於 Spring MVC 3.1 引入的請求對映基礎設施。例如,單個入站端點支援多個路徑。有關更多資訊,請參閱HTTP 名稱空間支援。
Spring Expression Language (SpEL) 配置
我們添加了一個新的 IntegrationEvaluationContextFactoryBean,允許配置自定義 PropertyAccessor 實現和函式,以便在整個框架的 SpEL 表示式中使用。有關更多資訊,請參閱Spring Expression Language (SpEL)。
SpEL 函式支援
為了使用靜態 Method 函式自定義 SpEL EvaluationContext,我們引入了 <spel-function/> 元件。我們還添加了兩個內建函式:#jsonPath 和 #xpath。有關更多資訊,請參閱SpEL 函式。
SpEL PropertyAccessor 支援
為了使用 PropertyAccessor 實現自定義 SpEL EvaluationContext,我們添加了 <spel-property-accessors/> 元件。有關更多資訊,請參閱屬性訪問器。
Redis:新元件
我們添加了一個新的基於 Redis 的 MetadataStore 實現。您可以使用 RedisMetadataStore 在應用程式重新啟動後維護 MetadataStore 的狀態。這個新的 MetadataStore 實現可以與介面卡一起使用,例如:
-
Twitter 入站介面卡
-
Feed 入站通道介面卡
我們添加了新的基於佇列的元件。我們添加了 <int-redis:queue-inbound-channel-adapter/> 和 <int-redis:queue-outbound-channel-adapter/> 元件,分別對 Redis 列表執行“右彈出”和“左推入”操作。
有關更多資訊,請參閱“Redis 支援”。
Header Channel Registry
您現在可以指示框架將回復通道和錯誤通道儲存在登錄檔中,以便稍後解析。這對於 replyChannel 或 errorChannel 可能丟失的情況(例如,序列化訊息時)很有用。有關更多資訊,請參閱訊息頭增強器。
MongoDB 支援:新的 ConfigurableMongoDbMessageStore
除了現有的 eMongoDbMessageStore,我們還引入了一個新的 ConfigurableMongoDbMessageStore。這為 MongoDB 提供了更健壯、更靈活的 MessageStore 實現。它與現有儲存不向後相容,但我們建議在新應用程式中使用它。現有應用程式可以使用它,但舊儲存中的訊息將不可用。有關更多資訊,請參閱MongoDb 支援。
Syslog 支援
在 2.2 SyslogToMapTransformer 的基礎上,Spring Integration 3.0 引入了專門用於接收 SYSLOG 訊息的 UDP 和 TCP 入站通道介面卡。有關更多資訊,請參閱Syslog 支援。
tail 支援
我們添加了檔案入站通道介面卡,它們使用 tail 命令在文字檔案末尾新增行時生成訊息。請參閱追蹤檔案。
JMX 支援
我們添加了 <int-jmx:tree-polling-channel-adapter/>。此介面卡查詢 JMX MBean 樹,併發送一個訊息,其有效負載是與查詢匹配的物件圖。預設情況下,MBeans 對映到基本型別和簡單物件(例如 Map、List 和陣列)。它允許簡單轉換為例如 JSON。
IntegrationMBeanExporter 現在允許透過使用 naming-strategy 屬性配置自定義 ObjectNamingStrategy。
有關更多資訊,請參閱JMX 支援。
TCP/IP 連線事件和連線管理
當連線開啟或關閉或發生異常時,TcpConnection 例項現在會發出 ApplicationEvent 例項(特別是 TcpConnectionEvent 例項)。此更改允許應用程式透過使用正常的 Spring ApplicationListener 機制瞭解 TCP 連線的更改。
我們將 AbstractTcpConnection 重新命名為 TcpConnectionSupport。此類的自定義連線子類可以使用其方法釋出事件。同樣,我們將 AbstractTcpConnectionInterceptor 重新命名為 TcpConnectionInterceptorSupport。
此外,我們添加了 <int-ip:tcp-connection-event-inbound-channel-adapter/>。預設情況下,此介面卡會將所有 TcpConnectionEvent 例項傳送到 Channel。
此外,TCP 連線工廠現在提供了一個名為 getOpenConnectionIds() 的新方法,該方法返回所有開啟連線的識別符號列表。它允許應用程式向所有開啟的連線廣播,以及其他用途。
最後,連線工廠還提供了一個名為 closeConnection(String connectionId) 的新方法,允許應用程式透過其 ID 顯式關閉連線。
有關更多資訊,請參閱TCP 連線事件。
入站通道介面卡指令碼支援
<int:inbound-channel-adapter/> 現在支援使用 <expression/> 和 <script/> 子元素來建立 MessageSource。請參閱通道介面卡表示式和指令碼。
內容增強器:訊息頭增強支援
內容增強器現在提供 <header/> 子元素的配置,以根據底層訊息流的回覆訊息來增強出站訊息的訊息頭。有關更多資訊,請參閱負載增強器。
一般更改
本節描述了從版本 2.2 到版本 3.0 的一般更改。
訊息 ID 生成
以前,訊息 ID 是使用 JDK UUID.randomUUID() 方法生成的。在此版本中,預設機制已更改為使用更高效且顯著更快的演算法。此外,我們增加了更改用於生成訊息 ID 的策略的能力。有關更多資訊,請參閱訊息 ID 生成。
“<gateway>” 更改
您現在可以在所有閘道器方法中設定通用訊息頭,並且我們增加了更多選項來向訊息新增有關已呼叫方法的資訊。
您現在可以完全自定義閘道器方法呼叫對映到訊息的方式。
GatewayMethodMetadata 現在是一個公共類。它允許您從 Java 以程式設計方式配置 GatewayProxyFactoryBean。
有關更多資訊,請參閱訊息閘道器。
HTTP 端點更改
-
出站端點
encode-uri:<http:outbound-gateway/>和<http:outbound-channel-adapter/>現在提供encode-uri屬性,允許在傳送請求之前停用 URI 物件的編碼。 -
入站端點
merge-with-default-converters:<http:inbound-gateway/>和<http:inbound-channel-adapter/>現在有一個merge-with-default-converters屬性,用於在自定義訊息轉換器之後包含預設HttpMessageConverter例項列表。 -
If-Modified-Since和If-Unmodified-SinceHTTP 訊息頭: 以前,If-Modified-Since和If-Unmodified-SinceHTTP 訊息頭在DefaultHttpHeaderMapper中對映的 HTTP 訊息頭中處理不正確。現在,除了糾正此問題外,DefaultHttpHeaderMapper還提供從格式化字串中解析日期以用於接受日期時間值的任何 HTTP 訊息頭的功能。 -
入站端點表示式變數: 除了現有的
#requestParams和#pathVariables,<http:inbound-gateway/>和<http:inbound-channel-adapter/>現在支援額外的有用變數:#matrixVariables、#requestAttributes、#requestHeaders和#cookies。這些變數在有效負載和訊息頭表示式中都可用。 -
出站端點 'uri-variables-expression': HTTP 出站端點現在支援
uri-variables-expression屬性,用於指定一個Expression來評估 URL 模板中所有 URI 變數佔位符的Map。這允許根據出站訊息選擇不同的表示式對映。
有關更多資訊,請參閱HTTP 支援。
Jackson 支援 (JSON)
-
引入了 JSON 轉換的新抽象。目前提供了 Jackson 1.x 和 Jackson 2 的實現,版本由類路徑上的存在確定。以前,只支援 Jackson 1.x。
-
ObjectToJsonTransformer和JsonToObjectTransformer現在發出/使用包含型別資訊的訊息頭。
有關更多資訊,請參閱轉換器中的“JSON 轉換器”。
鏈元素 id 屬性
以前,<chain> 中元素的 id 屬性被忽略,在某些情況下甚至不允許。現在,<chain> 中所有元素都允許使用 id 屬性。鏈元素的 bean 名稱是周圍鏈的 id 和元素本身的 id 的組合。例如:“myChain$child.myTransformer.handler”。有關更多資訊,請參閱訊息處理程式鏈。
聚合器 'empty-group-min-timeout' 屬性
AbstractCorrelatingMessageHandler 提供了一個名為 empty-group-min-timeout 的新屬性,允許空組過期以比過期部分組更長的計劃執行。空組在至少經過此毫秒數未被修改之前不會從 MessageStore 中刪除。有關更多資訊,請參閱使用 XML 配置聚合器。
持久檔案列表過濾器(檔案,(S)FTP)
現在提供了使用持久 MetadataStore 的新 FileListFilter 實現。您可以使用它們來防止系統重新啟動後出現重複檔案。有關更多資訊,請參閱讀取檔案、FTP 入站通道介面卡和SFTP 入站通道介面卡。
Direct Channel 負載均衡配置
以前,在通道的 dispatcher 子元素上配置 LoadBalancingStrategy 時,唯一的可用選項是使用預定義的值列舉,這不允許開發人員設定 LoadBalancingStrategy 的自定義實現。您現在可以使用 load-balancer-ref 提供對 LoadBalancingStrategy 的自定義實現的引用。有關更多資訊,請參閱DirectChannel。
PublishSubscribeChannel 行為
以前,傳送到沒有訂閱者的 <publish-subscribe-channel/> 會返回 false 結果。如果與 MessagingTemplate 結合使用,這將導致丟擲異常。現在,PublishSubscribeChannel 有一個名為 minSubscribers 的屬性(預設值:0)。如果訊息傳送給至少最小數量的訂閱者,則傳送操作被認為是成功的(即使數量為零)。如果應用程式期望在這些條件下獲得異常,請將最小訂閱者設定為至少 1。
FTP、SFTP 和 FTPS 更改
FTP、SFTP 和 FTPS 端點預設不再快取會話。
我們從所有端點中刪除了已棄用的 cached-sessions 屬性。以前,由該屬性值控制的嵌入式快取機制無法限制快取的大小,這可能會無限增長。2.1 版本引入了 CachingConnectionFactory,它成為快取會話的首選(現在是唯一)方式。
CachingConnectionFactory 現在提供了一個新方法:resetCache()。此方法立即關閉空閒會話,並導致使用中的會話在返回快取時關閉。
DefaultSftpSessionFactory(與 CachingSessionFactory 結合使用)現在支援透過單個 SSH 連線多路複用通道(僅限 SFTP)。
FTP、SFTP 和 FTPS 入站介面卡
以前,無法覆蓋用於處理從遠端伺服器檢索的檔案的預設過濾器。filter 屬性決定檢索哪些檔案,但 FileReadingMessageSource 使用 AcceptOnceFileListFilter。這意味著,如果檢索到的新檔案副本與以前複製的檔案同名,則介面卡不會發送任何訊息。
在此版本中,新屬性 local-filter 允許您覆蓋預設過濾器(例如,使用 AcceptAllFileListFilter 或其他一些自定義過濾器)。
如果您希望 AcceptOnceFileListFilter 的行為在 JVM 執行之間保持不變,您現在可以配置一個保留狀態的自定義過濾器,例如在檔案系統上。
入站通道介面卡現在支援 preserve-timestamp 屬性,該屬性將本地檔案修改時間戳設定為來自伺服器的時間戳(預設值:false)。
FTP、SFTP 和 FTPS 閘道器
閘道器現在支援 mv 命令,從而可以重新命名遠端檔案。
閘道器現在支援遞迴 ls 和 mget 命令,從而可以檢索遠端檔案樹。
閘道器現在支援 put 和 mput 命令,從而可以向遠端伺服器傳送檔案。
現在支援 local-filename-generator-expression 屬性,從而可以在檢索期間命名本地檔案。預設情況下,使用與遠端檔案相同的名稱。
現在支援 local-directory-expression 屬性,從而可以在檢索期間命名本地目錄(基於遠端目錄)。
遠端檔案模板
在 FTP 和 SFTP 模組使用的 Session 實現之上提供了一個新的更高級別的抽象(RemoteFileTemplate)。雖然它在內部由端點使用,但您也可以以程式設計方式使用此抽象。與所有 Spring *Template 實現一樣,它可靠地關閉底層會話,同時允許對會話進行低階訪問。
有關更多資訊,請參閱FTP/FTPS 介面卡和SFTP 介面卡。
出站閘道器的 'requires-reply' 屬性
所有出站閘道器(例如 <jdbc:outbound-gateway/> 或 <jms:outbound-gateway/>)都設計用於“請求-回覆”場景。預期從外部服務接收響應,並將其釋出到 reply-channel 或 replyChannel 訊息頭。但是,在某些情況下,外部系統可能不總是返回結果(例如,<jdbc:outbound-gateway/> 在 SELECT 結束時返回空的 ResultSet,或者可能是一個單向 Web 服務)。因此,開發人員需要一個選項來配置是否需要回復。為此,我們為出站閘道器元件引入了 requires-reply 屬性。在大多數情況下,requires-reply 的預設值為 true。如果沒有結果,則會丟擲 ReplyRequiredException。將值更改為 false 意味著,如果外部服務不返回任何內容,則訊息流在該點結束,類似於出站通道介面卡。
WebService 出站閘道器有一個額外的屬性 ignore-empty-responses。它用於將空 String 響應視為未收到響應。預設情況下,它為 true,但您可以將其設定為 false 以允許應用程式在回覆訊息有效負載中接收空 String。當屬性為 true 時,空字串被視為沒有響應,以用於 requires-reply 屬性。預設情況下,WebService 出站閘道器的 requires-reply 為 false。 |
請注意,requiresReply 屬性以前存在,但在 AbstractReplyProducingMessageHandler 中設定為 false,並且無法使用 XML 名稱空間在出站閘道器上配置它。
以前,沒有收到回覆的閘道器會靜默結束流(並帶有 DEBUG 日誌訊息)。預設情況下,在此更改後,大多數閘道器現在會丟擲異常。要恢復到以前的行為,請將 requires-reply 設定為 false。 |
AMQP 出站閘道器訊息頭對映
以前,<int-amqp:outbound-gateway/> 在呼叫訊息轉換器之前對映訊息頭,轉換器可能會覆蓋 content-type 等訊息頭。出站介面卡在轉換後對映訊息頭,這意味著使用出站 Message 中的 content-type 等訊息頭(如果存在)。
從這個版本開始,閘道器現在在訊息轉換後對映訊息頭,與介面卡保持一致。如果您的應用程式依賴於以前的行為(轉換器的訊息頭覆蓋了對映的訊息頭),您需要過濾這些訊息頭(在訊息到達閘道器之前)或適當設定它們。受 SimpleMessageConverter 影響的訊息頭是 content-type 和 content-encoding。自定義訊息轉換器可能會設定其他訊息頭。
儲存過程元件改進
對於標準 CallableStatement.getObject 方法不支援的更復雜的資料庫特定型別,我們為具有 OUT-direction 的 <sql-parameter-definition/> 元素引入了兩個新的附加屬性:
-
型別名稱 -
返回型別
儲存過程入站通道介面卡 <returning-resultset/> 子元素的 row-mapper 屬性現在支援引用 RowMapper bean 定義。以前,它只包含一個類名(仍然支援)。
有關更多資訊,請參閱儲存過程。
Web 服務出站 URI 配置
Web 服務出站閘道器的 'uri' 屬性現在支援 Spring Web Services 支援的所有 URI 方案的 <uri-variable/> 替換。有關更多資訊,請參閱出站 URI 配置。
Redis 介面卡更改
Redis 入站通道介面卡現在可以為 serializer 屬性使用 null 值,原始資料作為訊息負載。
Redis 出站通道介面卡現在具有 topic-expression 屬性,用於在執行時確定 Message 的 Redis 主題。
Redis 入站通道介面卡,除了現有的 topics 屬性外,現在還具有 topic-patterns 屬性。
有關更多資訊,請參閱Redis 支援。
通知過濾器
以前,當 <filter/> 具有 <request-handler-advice-chain/> 時,丟棄操作完全在 advice chain 的範圍內執行(包括 discard-channel 上的任何下游流)。filter 元素現在有一個名為 discard-within-advice 的屬性(預設值:true),允許在 advice chain 完成後執行丟棄操作。請參閱通知過濾器。
使用註解通知端點
請求處理程式通知鏈現在可以使用註解進行配置。請參閱使用註解通知端點。
ObjectToStringTransformer 改進
此轉換器現在可以正確地將 byte[] 和 char[] 有效負載轉換為 String。有關更多資訊,請參閱轉換器。
JPA 支援更改
要持久化或合併的有效負載現在可以是 java.lang.Iterable 型別。
在這種情況下,Iterable 返回的每個物件都被視為一個實體,並使用底層 EntityManager 進行持久化或合併。迭代器返回的空值將被忽略。
JPA 介面卡現在具有附加屬性,以便在執行持久化操作後,可選地重新整理和清除關聯持久化上下文中的實體。
檢索閘道器沒有機制來指定要檢索的第一個記錄,這是一個常見用例。檢索閘道器現在透過向閘道器定義新增 first-result 和 first-result-expression 屬性來支援指定此引數。有關更多資訊,請參閱檢索出站閘道器。
JPA 檢索閘道器和入站介面卡現在有一個屬性,用於將結果集中的最大結果數指定為表示式。此外,我們引入了 max-results 屬性來替換已棄用的 max-number-of-results。max-results 和 max-results-expression 分別用於提供結果集中的最大結果數或計算最大結果數的表示式。
有關更多資訊,請參閱JPA 支援。
延遲器:延遲表示式
以前,<delayer> 提供了一個 delay-header-name 屬性來在執行時確定延遲值。在複雜情況下,<delayer> 必須前面有一個 <header-enricher>。Spring Integration 3.0 引入了 expression 屬性和 expression 子元素用於動態延遲確定。delay-header-name 屬性現在已棄用,因為您可以在 expression 中指定訊息頭評估。此外,我們引入了 ignore-expression-failures 來控制表示式評估失敗時的行為。有關更多資訊,請參閱延遲器。
JDBC 訊息儲存改進
Spring Integration 3.0 為 MySQL 5.6.4 及更高版本添加了一組新的 DDL 指令碼。現在 MySQL 支援小數秒,從而在從基於 MySQL 的訊息儲存輪詢時改進了 FIFO 排序。有關更多資訊,請參閱通用 JDBC 訊息儲存。
IMAP 空閒連線異常
以前,如果 IMAP 空閒連線失敗,它會被記錄下來,但沒有機制通知應用程式。此類異常現在會生成 ApplicationEvent 例項。應用程式可以透過使用 <int-event:inbound-channel-adapter> 或任何配置為接收 ImapIdleExceptionEvent(或其超類之一)的 ApplicationListener 來獲取這些事件。
訊息頭和 TCP
TCP 連線工廠現在可以配置一種靈活的機制,透過 TCP 傳輸選定的訊息頭(以及有效負載)。新的 TcpMessageMapper 允許選擇訊息頭,並且您需要配置適當的序列化器或反序列化器以將生成的 Map 寫入 TCP 流。我們添加了 MapJsonSerializer 作為一種方便的機制,透過 TCP 傳輸訊息頭和有效負載。有關更多資訊,請參閱傳輸訊息頭。
JMS 訊息驅動通道介面卡
以前,在配置 <message-driven-channel-adapter/> 時,如果您希望使用特定的 TaskExecutor,則必須宣告一個容器 bean 並透過設定 container 屬性將其提供給介面卡。我們添加了 task-executor,允許將其直接設定在介面卡上。這是除了已經可用的其他幾個容器屬性之外的。
XsltPayloadTransformer
您現在可以透過設定 transformer-factory-class 屬性來指定轉換器工廠類名。請參閱 XsltPayloadTransformer。