领先一步
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 Bean 风格的对象表示,这些对象使用默认转换器转换为 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 Bean 约定的默认转换器集转换底层字符串。无论如何,这都不是我们在此情况下想要的,因为我们想将此对象存储为一个文档,其中每个字段分别表示,因此我们需要先将此字符串解析为一组字段。为此,我们将应用自定义 **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 入站通道适配器默认返回 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 入站通道适配器部分来了解更多详细信息 http://static.springsource.org/spring-integration/docs/2.2.0.RC1/reference/htmlsingle/#mongodb-inbound-channel-adapter
Spring Integration 2.2.RC1 已发布,在接下来的几周内,我们将讨论此版本中提供的一些新特性。请试用一下,并通过在本博客中评论或通过通常的 Spring Integration 论坛 让我们知道您的想法。