领先一步
VMware 提供培训和认证,助您加速进步。
了解更多您可以在下面看到 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 入站通道适配器的配置与任何其他轮询入站通道适配器非常相似。
<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 论坛 告诉我们您的想法。