MongoDB 入站适配器更新表达式和事务同步 DSL 示例

问题描述 投票:0回答:1

类似于 5 年前的这个问题,我试图定义一个 mongodb 源,在轮询时将记录标记为“正在处理”。当流程完成后,我想将记录标记为“完成”。从那时起,发生了很多变化,即在轮询消息源上添加了

update()
表达式。我正在 DSL 中寻找这样的示例。

我通读了这些文档:

本文档中的大多数示例(以及 Spring 文档中的几乎所有其他地方)都是 XML 形式。自从奥巴马担任总统以来,我就没有使用过 XML 来配置 Spring。我正在寻找 IntegrationFlow 的 DSL 示例,它将轮询 mongo 入站适配器(将其标记为“正在处理”)、处理它,然后将其标记为“完成”。

入站适配器的更新表达式可能会将其设置为“正在处理”。一旦它被标记为“正在处理”,它就几乎不会被任何其他轮询器拾取。

只需一个额外的处理程序(出站适配器?)即可将其标记为“完成”吗?

类似:

IntegrationFlow.from(MongoDb.inboundChannelAdapter(mongoTemplate, "{'status' : 'READY'}")
                                 .update("{'status' : 'PROCESSING'}"))
               .handle(//do something with it)
               .handle(//update to DONE)

我不太确定是否需要手动新建 MongoDbStoringMessageHandler 来更新记录,或者我是否应该在 mongoTemplate 上手动执行此操作。 MongoDb 帮助程序不包含用于构建出站适配器的任何内容。我仔细检查了文档有什么内容,你难道不知道吗,它只有 XML 形式。我唯一的另一个想法是,出站适配器仅用于获取出站消息并将它们作为新记录插入。

我也不确定通过在 MessageSource 实例上使用入站适配器会得到什么

mongoTemplate.findAndModify()

该文档继续进一步搅浑水,说“是的,你可以使用 updateExpression,但你可能仍然想使用事务”。那么

update()
not 能满足我的需要吗?我在有关事务同步的偏头痛和耳鸣诱发文档中了解了如何将事务同步添加到我的流程中。所有示例都是 XML。

java mongodb spring-boot spring-integration spring-integration-dsl
1个回答
0
投票

是的。我同意文档和相应的 Java DSL 仍然需要一些关爱,至少将其与我们为 MongoDB 出站网关提供的任何内容重新调整。

正如我们在文档中明确指出的那样,应用事务同步并不会使 MongoDB 本身具有事务性。从技术上讲,我们所说的

update
与您在事务同步中所做的完全一样(但更复杂)。

如果您在单个轮询线程中完成所有操作,那么您可能不需要额外的

DONE
步骤,而是直接对此
update
进行
DONE
。在这种情况下,直到当前轮询周期完成后,下一个轮询周期才会开始。

您可以考虑使用具有

MongoDbTemplate
功能的
MongoDbOutboundGateway
,而不是直接
collectionCallback
API,而您可以使用
MongoCollection.findOneAndUpdate()

我们这里人手不足,无法为您做一切事情。 另一方面,您知道,这是一个开源项目,因此请随时向我们反馈您认为合理的任何贡献。

© www.soinside.com 2019 - 2024. All rights reserved.