2.2 和 3.0 之間的更改

請參閱遷移指南,瞭解可能影響您應用程式的重要更改。您可以在維基上找到所有版本(從 2.1 開始)的遷移指南。

新元件

版本 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

您現在可以指示框架將回復通道和錯誤通道儲存在登錄檔中,以便稍後解析。這對於 replyChannelerrorChannel 可能丟失的情況(例如,序列化訊息時)很有用。有關更多資訊,請參閱訊息頭增強器

MongoDB 支援:新的 ConfigurableMongoDbMessageStore

除了現有的 eMongoDbMessageStore,我們還引入了一個新的 ConfigurableMongoDbMessageStore。這為 MongoDB 提供了更健壯、更靈活的 MessageStore 實現。它與現有儲存不向後相容,但我們建議在新應用程式中使用它。現有應用程式可以使用它,但舊儲存中的訊息將不可用。有關更多資訊,請參閱MongoDb 支援

Syslog 支援

在 2.2 SyslogToMapTransformer 的基礎上,Spring Integration 3.0 引入了專門用於接收 SYSLOG 訊息的 UDPTCP 入站通道介面卡。有關更多資訊,請參閱Syslog 支援

tail 支援

我們添加了檔案入站通道介面卡,它們使用 tail 命令在文字檔案末尾新增行時生成訊息。請參閱追蹤檔案

JMX 支援

我們添加了 <int-jmx:tree-polling-channel-adapter/>。此介面卡查詢 JMX MBean 樹,併發送一個訊息,其有效負載是與查詢匹配的物件圖。預設情況下,MBeans 對映到基本型別和簡單物件(例如 MapList 和陣列)。它允許簡單轉換為例如 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-SinceIf-Unmodified-Since HTTP 訊息頭: 以前,If-Modified-SinceIf-Unmodified-Since HTTP 訊息頭在 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。

  • ObjectToJsonTransformerJsonToObjectTransformer 現在發出/使用包含型別資訊的訊息頭。

有關更多資訊,請參閱轉換器中的“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 入站通道介面卡

指令碼支援:變數更改

我們為指令碼元件引入了一個新的 variables 屬性。此外,現在允許對內聯指令碼進行變數繫結。有關更多資訊,請參閱Groovy 支援指令碼支援

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 命令,從而可以重新命名遠端檔案。

閘道器現在支援遞迴 lsmget 命令,從而可以檢索遠端檔案樹。

閘道器現在支援 putmput 命令,從而可以向遠端伺服器傳送檔案。

現在支援 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-channelreplyChannel 訊息頭。但是,在某些情況下,外部系統可能不總是返回結果(例如,<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-typecontent-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-resultfirst-result-expression 屬性來支援指定此引數。有關更多資訊,請參閱檢索出站閘道器

JPA 檢索閘道器和入站介面卡現在有一個屬性,用於將結果集中的最大結果數指定為表示式。此外,我們引入了 max-results 屬性來替換已棄用的 max-number-of-resultsmax-resultsmax-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

© . This site is unofficial and not affiliated with VMware.