领先一步
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 论坛 让我们知道您的想法