[spring-projects/spring-boot]Spring boot 使用 spring-boot-starter-data-mongodb-reactive 创建两个 mongo 客户端

2024-04-23 876 views
5

你好,

spring boot 自动配置两个 MongoDB 客户端,一个通过 MongoAutoConfiguration,一个通过 MongoReactiveAutoConfiguration。如果我尝试排除 MongoAutoConfiguration 我收到以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 0 of method mongoDbFactory in org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration required a bean of type 'com.mongodb.MongoClient' that could not be found.
    - Bean method 'mongo' not loaded because auto-configuration 'MongoAutoConfiguration' was excluded

然后,如果我也尝试排除 MongoDataAutoConfiguration,则会收到以下错误:

***************************
APPLICATION FAILED TO START
***************************

Description:

Parameter 1 of method reactiveMongoTemplate in org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration required a bean of type 'org.springframework.data.mongodb.core.convert.MongoConverter' that could not be found.
    - Bean method 'mappingMongoConverter' not loaded because auto-configuration 'MongoDataAutoConfiguration' was excluded

看起来不可能排除非反应部分。下面您可以找到一个简单的示例,其中“使用设置创建的集群....等”被记录两次: https://github.com/cmario/spring-boot-embedded-mongodb

问候马里奥

回答

3

这是否给您带来了您注意到的日志记录之外的问题?自动配置的两个客户端不相同。一个是 的实例com.mongodb.reactivestreams.client.MongoClient,另一个是 的实例com.mongodb.MongoClient

3

实际上我的应用程序中有一个奇怪的行为。完全是随机的,在我身上发生了 2/3 次,一个 RESTFul 端点仅对 MongoDB 进行一次查询,它就卡住了。不考虑连接字符串的连接时间和套接字时间,没有错误,也没有日志。连接池看起来很好,因为我可以在日志中看到空闲连接已关闭并重新打开。重新启动 mongodb 本身没有帮助,我不得不重新启动应用程序本身。这就是我开始研究它的原因,我意识到创建了两个 mongodb 客户端。当然,我不确定这两件事是否相关,我知道我们正在谈论两个不同的客户,但你知道,越少的东西就越容易被破坏:-)。不幸的是这是相当随机的并且不容易调试。我将 mongodb 包置于调试模式,至少我希望下次发生这种情况时能看到一些东西。我会更新你的。

0

如果您希望我们查看此问题,请提供所需的信息。如果在接下来的 7 天内未提供信息,此问题将被关闭。

8

由于缺乏所需的反馈而关闭。如果您希望我们查看此问题,请提供所需的信息,我们将重新打开该问题。

0

我无法重现该问题。事实上,不应创建两个客户端实例(具有相关的连接池等),这是一种资源浪费。因此,我认为这个问题应该重新讨论。

7

当我们解决这个问题时,我们还应该为 Reactor 添加一个类条件MongoReactiveDataAutoConfiguration

6

如果已被排除,我们需要退缩MongoDataAutoConfigurationMongoAutoConfiguration

8

我不太记得我们在电话中讨论了什么。如果我们后退MongoDataAutoConfiguration,就会导致MongoReactiveDataAutoConfiguration失败,因为没有MongoConverterbean。我以为MongoDataAutoConfiguration并且MongoReactiveDataAutoConfiguration会完全独立,但事实似乎并非如此。

0

我认为MongoDataAutoConfiguration并且MongoReactiveDataAutoConfiguration将会完全独立

我以为他们也会如此。听起来我们需要解决这个问题。

MongoConverter也许我们可以将和它所依赖的其他 bean的配置移动到一个单独的配置类中,该配置类可以由MongoDataAutoConfiguration和导入MongoReactiveDataAutoConfiguration

3

MongoReactiveDataAutoConfiguration@mp911de 对于我们如何实现和之间的干净分离,您有什么建议吗MongoDataAutoConfiguration?目前,MongoReactiveDataAutoConfiguration创建了一个ReactiveMongoTemplate依赖于MappingMongoConverterfrom 的bean MongoDataAutoConfiguration。这看起来有点奇怪,因为它的MappingMongoConverter设置SimpleMongoDbFactory使用了阻塞MongoClient

8

Spring Data Mongo 中的命令式位和反应式位并不完全相互独立。目前我们需要一些基础设施部分,这些部分还需要存在阻塞驱动程序。

我们需要研究如何将基础设施与实际驱动程序解耦。

2

谢谢@mp911de。我在这里创建了一个问题来进行调查。

8

只需采取几个步骤即可实现解耦:

  1. MongoProperties.getMongoClientDatabase(…)必须使用ConnectionString而不是MongoClientURIMongoClientURI随阻塞驱动程序一起提供。
  2. 我们需要在 之外创建MongoMappingContextBean 。MongoCustomConversionsMongoDataAutoConfiguration
  3. 我们失去了@DBRef解决方案,因为我们无法再使用反应式驱动程序解析文档引用。引用解析仅在阻塞驱动程序位于类路径上时才起作用。这意味着,MappingMongoConverter必须使用不同的 来创建它DbRefResolver,具体取决于类路径上有哪些驱动程序。如果阻塞驱动程序可用(或两个驱动程序),则MongoMappingContext像现在一样进行配置。如果只配置了反应式,那么我们需要提供一个不同的DbRefResolver,但目前尚不可用。
  4. spring-boot-starter-data-mongodb-reactive需要不同的依赖项:我们需要删除org.mongodb:mongodb-driver并添加org.mongodb:bson
  5. 我们需要在 Spring Data MongoDB 中应用一些更改(例如,我们使用的是org.bson.types.CodeWScope仅与阻塞驱动程序一起提供的更改,因此我们需要有一个替代方案,例如org.bson.types.CodeWithScope

我们将在DATAMONGO-1919中应用 Spring Data MongoDB 更改。

/抄送@christophstrobl

7

我遇到了同样的问题,我找到了配置反应式 mongo 客户端的不同方法,但感觉很老套,现在我的反应式 mongo 运行状况指示器不起作用,因为与被覆盖的反应式 mongo 模板存在冲突。

当我删除排除自动配置时,我只能让我的反应式 mongo 运行状况指示器正常工作,但是随后注册了两个 mongo 客户端,一个阻止并解析到本地主机,所以对我来说这似乎是一场赌博;)期待看看它修好了!

9

如果应用程序同时包含阻塞式 mongo 客户端和反应式 mongo 客户端,将会发生什么情况。我们能得到两个健康指标吗?因为它们将根据以下方式在两个不同的连接上运行:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.reactive.repositories.usage

另请注意,如果使用响应式和阻塞式 Spring Data MongoDB 模板和存储库,您的应用程序将在两个不同的连接上运行。

是否可以为两个客户端/连接提供健康指示器?

1

我们能得到两个健康指标吗?

不是开箱即用的,不是。你为什么想要那个?当这些客户端通过自动配置创建时,它们指向完全相同的 MongoDB 服务,因此在我看来两个客户端是不必要的。如果您有更多问题,请加入我们的 Gitter,因为我们不使用跟踪器来提问。

4

@wilkinsona 和 @mbhave 我们刚刚将 SD-MongoDB 2.1 的解耦位 ( DATAMONGO-1919 ) 推向了掌握。要在没有同步驱动的情况下使用reactivestreams 驱动程序,org.mongodb.mongodb-driver-reactivestreams:1.9.0org.mongodb.bson:3.8.0都是必需的。

该更改应该允许您继续执行您这边所需的操作。

0

谢谢@christophstrobl。

@wilkinsona 我们已针对 2.0.x 解决此问题。该更改需要org.mongodb.mongodb-driver-reactivestreams:1.9.0andorg.mongodb.bson:3.8.0因此看起来我们需要将其移动到2.1.x(除非它可以向后移植到org.mongodb.mongodb-driver-reactivestreams:1.7.xand org.mongodb.bson:3.6.x)。

5

同意。让我们将其移至待办事项列表中。