使用 Spring 数据 Mongo 和 Spring 与 Azure CosmosDB (MongoDB) 集成的连接问题

Connectivity problem using Spring Data Mongo and Spring Integration with Azure CosmosDB (MongoDB)

我有以下设置:

应用程序应从 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 没有抛出任何异常并跳转到下一个处理程序...