領先一步
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() 演示中儲存一個簡單的逗號分隔的 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 中的文件。 在本例中,我們將使用 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 論壇 讓我們知道您的想法