使用 Spring 数据 Mongo 和 Spring 与 Azure CosmosDB (MongoDB) 集成的连接问题
Connectivity problem using Spring Data Mongo and Spring Integration with Azure CosmosDB (MongoDB)
我有以下设置:
- Spring 与 Spring 数据 Mongo 存储库集成
- 以上应用程序 运行 作为 kubernetes(Azure Kubernetes 服务)上的 pod
- 以上应用程序连接到 Azure CosmosDB (MongoDB)
- 以上应用程序连接到 Azure SQL 服务器
应用程序应从 MongoDB 获取信息并开始处理。它在 运行 本地和 docker 容器内工作正常。当它部署到 AKS 时会出现问题,因为它无法在引导时建立与 Mongo 和 Azure SQL 的连接。再过 3 秒左右,连接将成功打开,您可以在此处看到:https://gist.github.com/nadworny/c69659e65a7d6e8d96573db13d1f1095
为了比较,这里是来自本地主机的引导日志:https://gist.github.com/nadworny/c04d6baa571e5b7ddcbd8856cf22a390
我也无法解释的是之后发生的事情。我有一个 Mongo 入站适配器,如下所示:
return IntegrationFlows.from(MongoDb.reactiveInboundChannelAdapter(mongoDbFactory,
new Query().addCriteria(Criteria.where("status").is(ProcessingStatus.PROCESSED))
.with(Sort.by(Sort.Direction.DESC, "modifiedDate")).limit(1))
.collectionName("processingMetadata")
.entityClass(ProcessingMetadata.class)
.expectSingleResult(true),
e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(pollingIntervalSeconds))))
.<Mono<ProcessingMetadata>>handle((p, h) -> {
// do something
})
它应该每 3 秒轮询 Mongo,但实际上它从来没有轮询过(同样它在本地工作没有问题)。
此后连接工作正常,因为我有另一个由文件上传触发的进程并且它工作正常(数据写入 MongoDB)。
老实说,我有点困惑是哪个组件在这里造成了麻烦,所以我希望你能帮我缩小范围。
更新1
我做了一些进一步的调试。实际上这不是 mongo 的问题,而是它之后的下一个处理程序是 Jpa 网关:
.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
.entityClass(DocumentHeader.class)
.jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
.parameterExpression("modified", "payload")
.maxResults(maxResults), e -> e.id("retrieveDocumentHeader"))
.<List>handle((p, h) -> {
if (p.isEmpty())
this.advices.waitUntilCompletedAdvice().setWait(false);
return p;
})
.channel(Channels.DOCUMENT_HEADER.name())
出于某种原因,在 AKS 上执行时,不会调用 Jpa 处理程序,Spring集成直接跳转到下一步:
2020-09-25 08:35:07.771 DEBUG 1 --- [ask-scheduler-3] o.s.d.m.core.ReactiveMongoTemplate : find using query: { "status" : "PROCESSED"} fields: Document{{}} for class: class com.zurich.ccmc.data.orchestrator.domain.targetdb.ProcessingMetadata in collection: processingMetadata
2020-09-25 08:35:07.771 DEBUG 1 --- [ask-scheduler-3] o.s.i.e.SourcePollingChannelAdapter : Poll resulted in Message: GenericMessage [payload=MonoNext, headers={mongo_collectionName=processingMetadata, id=4a26e221-deb9-f1af-1c35-7ba0d47042b1, timestamp=1601022907771}]
2020-09-25 08:35:07.778 DEBUG 1 --- [ask-scheduler-3] o.s.i.splitter.DefaultMessageSplitter : handler 'bean 'setProcessingStatusToOpen.splitter#0' for component 'setProcessingStatusToOpen.org.springframework.integration.config.ConsumerEndpointFactoryBean#0'; defined in: 'class path resource [xxx/processing/ProcessingMetadataFlow.class]'; from source: 'bean method setProcessingStatusToOpen'' produced no reply for request Message: GenericMessage [payload=[], headers={mongo_collectionName=processingMetadata, id=0a446b4c-12fc-d72d-d4ad-8453eb51227c, timestamp=1601022907778}]
找到问题了。 spring.datasource.jdbc-url 参数错误(jdbc:sqlserver:// 在部署到 AKS 时开始)。我希望有某种适当的例外,但只有这个警告:
2020-09-24 14:33:04.710 WARN 1 --- [ task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata : Driver com.microsoft.sqlserver.jdbc.SQLServerDriver
accept jdbcUrl, xxx.database.windows.net
我也不明白为什么 Jpa.retrievingGateway 没有抛出任何异常并跳转到下一个处理程序...
我有以下设置:
- Spring 与 Spring 数据 Mongo 存储库集成
- 以上应用程序 运行 作为 kubernetes(Azure Kubernetes 服务)上的 pod
- 以上应用程序连接到 Azure CosmosDB (MongoDB)
- 以上应用程序连接到 Azure SQL 服务器
应用程序应从 MongoDB 获取信息并开始处理。它在 运行 本地和 docker 容器内工作正常。当它部署到 AKS 时会出现问题,因为它无法在引导时建立与 Mongo 和 Azure SQL 的连接。再过 3 秒左右,连接将成功打开,您可以在此处看到:https://gist.github.com/nadworny/c69659e65a7d6e8d96573db13d1f1095
为了比较,这里是来自本地主机的引导日志:https://gist.github.com/nadworny/c04d6baa571e5b7ddcbd8856cf22a390
我也无法解释的是之后发生的事情。我有一个 Mongo 入站适配器,如下所示:
return IntegrationFlows.from(MongoDb.reactiveInboundChannelAdapter(mongoDbFactory,
new Query().addCriteria(Criteria.where("status").is(ProcessingStatus.PROCESSED))
.with(Sort.by(Sort.Direction.DESC, "modifiedDate")).limit(1))
.collectionName("processingMetadata")
.entityClass(ProcessingMetadata.class)
.expectSingleResult(true),
e -> e.poller(Pollers.fixedDelay(Duration.ofSeconds(pollingIntervalSeconds))))
.<Mono<ProcessingMetadata>>handle((p, h) -> {
// do something
})
它应该每 3 秒轮询 Mongo,但实际上它从来没有轮询过(同样它在本地工作没有问题)。
此后连接工作正常,因为我有另一个由文件上传触发的进程并且它工作正常(数据写入 MongoDB)。
老实说,我有点困惑是哪个组件在这里造成了麻烦,所以我希望你能帮我缩小范围。
更新1
我做了一些进一步的调试。实际上这不是 mongo 的问题,而是它之后的下一个处理程序是 Jpa 网关:
.handle(Jpa.retrievingGateway(this.sourceEntityManagerFactory)
.entityClass(DocumentHeader.class)
.jpaQuery("from DocumentHeader d where d.modifiedDate > :modified")
.parameterExpression("modified", "payload")
.maxResults(maxResults), e -> e.id("retrieveDocumentHeader"))
.<List>handle((p, h) -> {
if (p.isEmpty())
this.advices.waitUntilCompletedAdvice().setWait(false);
return p;
})
.channel(Channels.DOCUMENT_HEADER.name())
出于某种原因,在 AKS 上执行时,不会调用 Jpa 处理程序,Spring集成直接跳转到下一步:
2020-09-25 08:35:07.771 DEBUG 1 --- [ask-scheduler-3] o.s.d.m.core.ReactiveMongoTemplate : find using query: { "status" : "PROCESSED"} fields: Document{{}} for class: class com.zurich.ccmc.data.orchestrator.domain.targetdb.ProcessingMetadata in collection: processingMetadata
2020-09-25 08:35:07.771 DEBUG 1 --- [ask-scheduler-3] o.s.i.e.SourcePollingChannelAdapter : Poll resulted in Message: GenericMessage [payload=MonoNext, headers={mongo_collectionName=processingMetadata, id=4a26e221-deb9-f1af-1c35-7ba0d47042b1, timestamp=1601022907771}]
2020-09-25 08:35:07.778 DEBUG 1 --- [ask-scheduler-3] o.s.i.splitter.DefaultMessageSplitter : handler 'bean 'setProcessingStatusToOpen.splitter#0' for component 'setProcessingStatusToOpen.org.springframework.integration.config.ConsumerEndpointFactoryBean#0'; defined in: 'class path resource [xxx/processing/ProcessingMetadataFlow.class]'; from source: 'bean method setProcessingStatusToOpen'' produced no reply for request Message: GenericMessage [payload=[], headers={mongo_collectionName=processingMetadata, id=0a446b4c-12fc-d72d-d4ad-8453eb51227c, timestamp=1601022907778}]
找到问题了。 spring.datasource.jdbc-url 参数错误(jdbc:sqlserver:// 在部署到 AKS 时开始)。我希望有某种适当的例外,但只有这个警告:
2020-09-24 14:33:04.710 WARN 1 --- [ task-1] o.h.e.j.e.i.JdbcEnvironmentInitiator : HHH000342: Could not obtain connection to query metadata : Driver com.microsoft.sqlserver.jdbc.SQLServerDriver
accept jdbcUrl, xxx.database.windows.net
我也不明白为什么 Jpa.retrievingGateway 没有抛出任何异常并跳转到下一个处理程序...