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

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

介紹

Spring Integration 2.2.RC1 已經發布,我們將在未來幾天釋出一系列部落格,討論其一些新功能。在這第一篇部落格中,我們將討論 MongoDb 入站和出站通道介面卡。完整的示例集可在此處獲取:https://github.com/SpringSource/spring-integration-samples/tree/master/basic/mongodb

MongoDb 出站通道介面卡

MongoDb 出站通道介面卡允許您將訊息負載寫入 MongoDb 文件儲存。

您可以在下面看到 MongoDb 通道介面卡最簡單的配置

<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 入站通道介面卡

MongoDb 入站通道介面卡允許您從 MongoDb 讀取文件並將其作為訊息有效負載向下遊傳送。

這個簡單的示例向您展示瞭如何讀取儲存在 MongoDb 中的文件。對於此示例,我們將使用上一節中討論的 MongoDb 出站通道介面卡儲存的資料。從下面的示例中可以看到,MongoDb 入站通道介面卡的配置與任何其他輪詢入站通道介面卡非常相似。

<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 入站通道介面卡預設返回列表,因此您可以輕鬆地配置一個非常基本的下游拆分器(如本例所示)來一次處理一個訊息。執行 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' 來避免返回列表。

此外,您可能希望對從 MongoDb 讀取的成功處理的資料進行一些後處理。例如;您可能希望在文件處理後移動或刪除它。您可以使用 Spring Integration 2.2 中新增的事務同步功能來實現此目的,該功能將在本系列的下一篇部落格中討論,預計幾天後釋出(來自 Gary Russell)。但是,急於瞭解的人現在可以透過閱讀參考手冊的 MongoDb 入站通道介面卡部分獲取更多詳細資訊 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 社群所有即將舉行的活動。

檢視所有