Spring Integration 2.2.RC1 的新特性 (第一部分 - MongoDb)

工程 | Oleg Zhurakousky | 2012 年 9 月 24 日 | ...

介绍

Spring Integration 2.2.RC1 已经发布,在接下来的几天里,我们将发布一系列博客,讨论其一些新功能。 在这第一篇博客中,我们将讨论 MongoDb Inbound 和 Outbound Channel Adapter。完整的示例集可以在这里找到

MongoDb Outbound Channel Adapter

MongoDb Outbound Channel Adapter 允许您将 Message payload 写入 MongoDb 文档存储。

您可以在下面看到 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 Inbound Channel Adapter

MongoDb Inbound Channel Adapter 允许您从 MongoDb 读取文档并将其作为 Message payload 向下游发送。

这个简单的例子向您展示了如何读取存储在 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 论坛 让我们知道您的想法

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加速您的进度。

了解更多

获取支持

Tanzu Spring 在一个简单的订阅中为 OpenJDK™、Spring 和 Apache Tomcat® 提供支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看所有