搶先一步
VMware 提供培訓和認證,以加速您的進展。
了解更多您可以在下方看到 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 中的文件。對於此範例,我們將使用前一節中討論的 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 論壇 告訴我們您的想法