Spring Integration 2.2.RC1 新功能 (第一部分 - MongoDb)

工程 | Oleg Zhurakousky | 2012 年 9 月 24 日 | ...

簡介

Spring Integration 2.2.RC1 已發佈,我們將在接下來的幾天內發佈一系列部落格文章,討論其一些新功能。在這第一篇部落格中,我們將討論 MongoDb Inbound 和 Outbound Channel Adapters。完整範例集可在此處取得

MongoDb Outbound Channel Adapter

MongoDb Outbound Channel Adapter 允許您將訊息酬載寫入 MongoDb 文件儲存區。

您可以在下方看到 MongoDb Channel Adapter 最簡單的配置

<int-mongodb:outbound-channel-adapter id="deafultAdapter"/>

它將使用 MongoDbFactory 的預設實例(預設 bean 名稱是 'mongoDbFactory')初始化,否則您可以透過 mongodb-factory 屬性提供其參考。

現在您可以執行 MongoDbOutboundAdapterDemo。執行後,開啟終端機視窗並啟動 MongoDb CLI

$> mongo

進入 MongoDb CLI 後,輸入查詢

> db.data.find({})

您應該會看到我們剛剛建立的 3 個文件條目

{ "_id" : ObjectId("505ff83d03649ed6881d066b"), "_class" : "org.springframework.integration.samples.mongodb.domain.Person", "fname" : "John", "lname" : "Doe", "address" : { "street" : "3401 Hillview Ave", "city" : "Palo Alto", "zip" : "94304", "state" : "CA" } }
{ "_id" : ObjectId("505ff83d03649ed6881d066c"), "_class" : "org.springframework.integration.samples.mongodb.domain.Person", "fname" : "Josh", "lname" : "Doe", "address" : { "street" : "123 Main st", "city" : "San Francisco", "zip" : "94115", "state" : "CA" } }
{ "_id" : ObjectId("505ff83d03649ed6881d066d"), "_class" : "org.springframework.integration.samples.mongodb.domain.Person", "fname" : "Jane", "lname" : "Doe", "address" : { "street" : "2323 Market st", "city" : "Philadelphia", "zip" : "19152", "state" : "PA" } }

請注意,我們的條目是由非常簡單的 Java Beans 樣式物件表示,這些物件使用預設轉換器轉換為 JSON 字串。

讓我們嘗試稍微複雜化問題。我們將嘗試在 MongoDbOutboundAdapterDemo().runSimpleComplexAdapter() 示範中儲存一個簡單的逗號分隔字串

messageChannel.send(new GenericMessage<String>("John Dow, Palo Alto, 3401 Hillview Ave, 94304, CA"));

如您所見,我們正在傳送一個帶有字串酬載的訊息,該酬載代表一個人。執行此程式碼將導致

Caused by: java.lang.IllegalArgumentException: can't serialize class java.lang.Character

那是因為 MongoDb 嘗試使用基於 Java Beans 慣例的預設轉換器集轉換底層字串。在任何情況下,這都不是我們在此案例中尋找的,因為我們希望將此物件儲存為文件,每個欄位個別表示,因此我們需要先將此字串解析為一組欄位。為此,我們將套用自訂 MongoConverter。修改 simpleAdapterWithConverter 的範例配置,以新增對已配置轉換器的參考。

<int-mongodb:outbound-channel-adapter id="adapterWithConverter"
				mongo-converter="stringConverter"/>

再次執行示範,您會看到這次它將成功,並且您應該看到儲存的物件為

{ "_id" : ObjectId("505ffeac0364f8a92337657e"), "fname" : "John", "lname" : "Dow", "address" : { "city" : "Palo Alto", "street" : "3401 Hillview Ave", "zip" : "94304", "state" : "CA" } }

這次轉換是使用提供的轉換器完成的,您可以在 StringConverter.write(..) 方法中看到,我們所做的只是解析輸入字串,並將其資料作為個別欄位新增至 DBObject 的實例。

對於更複雜的場景,您也可以使用 MongoTemplate 的自訂實例來引導配接器,但這超出本部落格的範圍。

MongoDb Inbound Channel Adapter

MongoDb Inbound Channel Adapter 允許您從 MongoDb 讀取文件,並將它們作為訊息酬載向下游傳送。

這個簡單的範例向您展示如何讀取儲存在 MongoDb 中的文件。對於此範例,我們將使用前一節中討論的 MongoDb Outbound Channel Adapter 儲存的資料。從下面的範例中您可以看到,MongoDb Inbound Channel Adapter 的配置與任何其他輪詢 Inbound Channel Adapter 非常相似。

<int-mongodb:inbound-channel-adapter id="simpleInboundAdapter" channel="splittingChannel" 
									     query="{address.state : 'CA'}">
		<int:poller fixed-rate="60000" max-messages-per-poll="1"/>
</int-mongodb:inbound-channel-adapter>

請注意 query 屬性,它允許您提供以簡單字串表示的 JSON 查詢。有關 MongoDb 查詢的更多資訊,請參閱 MongoDb 文件。您也可以改用 query-expression 屬性,以依靠 SpEL 的強大功能來實現與查詢相關的更大動態。在上述情況下,我們選擇 address 元素的 state 元素為 'CA' 的所有文件。您可能已經猜到,MongoDb Inbound Channel Adapter 預設傳回 List,因此您可以輕鬆配置一個非常基本的分離器下游(如本範例中所示),以便一次處理一個訊息。執行 MongoDbInboundAdapterDemo,您應該會在主控台中看到結果

04:37:30.720 WARN  . . . { "_id" : { "$oid" : "50601bca0364063859066bcd"} , "_class" : "org.springframework.integration.samples.mongodb.domain.Person" , "fname" : "John" , "lname" : "Doe" , "address" : { "street" : "3401 Hillview Ave" , "city" : "Palo Alto" , "zip" : "94304" , "state" : "CA"}}
04:37:30.722 WARN  . . . { "_id" : { "$oid" : "50601bca0364063859066bce"} , "_class" : "org.springframework.integration.samples.mongodb.domain.Person" , "fname" : "Josh" , "lname" : "Doe" , "address" : { "street" : "123 Main st" , "city" : "San Francisco" , "zip" : "94115" , "state" : "CA"}}

但是,如果您知道您的查詢只能傳回單一結果,您可以透過配置 expect-single-result 屬性並將其值設定為 'true' 來避免傳回 List。

此外,您可能希望對從 MongoDb 讀取的已成功處理的資料進行一些後處理。例如;您可能希望在處理文件後移動或移除文件。您可以使用 Spring Integration 2.2 中新增的交易同步功能來執行此操作,這將在本系列的下一篇部落格文章中討論(幾天後由 Gary Russell 發佈)。然而,心急的人現在可以透過閱讀參考手冊的 MongoDb Inbound Channel Adapter 章節來取得更多詳細資訊 http://static.springsource.org/spring-integration/docs/2.2.0.RC1/reference/htmlsingle/#mongodb-inbound-channel-adapter

結論

Spring Integration 2.2.RC1 已發佈,在接下來的幾週內,我們將討論此版本中提供的一些新功能。試用看看,並透過在本部落格中評論或透過常用的 Spring Integration 論壇 告訴我們您的想法

取得 Spring 電子報

保持與 Spring 電子報的聯繫

訂閱

搶先一步

VMware 提供培訓和認證,以加速您的進展。

了解更多

取得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位檔案。

了解更多

即將到來的活動

查看 Spring 社群中所有即將到來的活動。

查看全部