Spring Integration 2.2.RC1 的新特性 (第一部分 - MongoDb)

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

介紹

Spring Integration 2.2.RC1 已經發布,在接下來的幾天裡,我們將釋出一系列部落格,討論其一些新功能。 在這第一篇部落格中,我們將討論 MongoDb Inbound 和 Outbound Channel Adapter。完整的示例集可以在這裡找到

MongoDb Outbound Channel Adapter

MongoDb Outbound Channel Adapter 允許您將 Message payload 寫入 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() 演示中儲存一個簡單的逗號分隔的 String

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

正如你所看到的,我們正在傳送一個帶有 String payload 的 Message,它代表一個人。執行此程式碼將導致

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(..) 方法中看到我們所做的只是解析輸入 String 並將其資料作為單獨的欄位新增到 DBObject 的例項中。

對於更復雜的場景,您還可以使用 MongoTemplate 的自定義例項來引導介面卡,但這超出了本部落格的範圍。

MongoDb Inbound Channel Adapter

MongoDb Inbound Channel Adapter 允許您從 MongoDb 讀取文件並將其作為 Message payload 向下遊傳送。

這個簡單的例子向您展示瞭如何讀取儲存在 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 社群中所有即將舉行的活動。

檢視所有