Проблема с подключением при использовании Spring Data Mongo и интеграции Spring с Azure CosmosDB (MongoDB)

У меня есть следующая установка:

  • Интеграция Spring с репозиториями Spring Data Mongo
  • Приведенное выше приложение, работающее как модуль в kubernetes (служба Azure Kubernetes)
  • Приведенное выше приложение подключается к Azure CosmosDB (MongoDB).
  • Вышеприведенное приложение подключается к Azure SQL Server.

Приложение должно получить информацию из MongoDB и начать обработку. Он отлично работает при локальном запуске и в контейнере докеров. Проблема возникает, когда он развернут в 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
        })

Он должен опрашивать Mongo каждые 3 секунды, но на самом деле этого никогда не происходит (опять же, он работает локально без проблем).

После этого подключение работает нормально, так как у меня есть другой процесс, который запускается загрузкой файла, и он работает правильно (данные записываются в MongoDB).

Честно говоря, я немного запутался, какой из компонентов вызывает здесь проблемы, поэтому я надеюсь, что вы поможете мне сузить круг поиска.

ОБНОВЛЕНИЕ1

Я провел дополнительную отладку. На самом деле это не проблема монго, а следующего за ним обработчика, который является Jpa Gateway:

.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 Integration сразу переходит к следующему шагу:

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}]



Ответы (1)


Нашел проблему. Неверный параметр 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 не выдал никакого исключения и не перешел к следующему обработчику...

person Blink    schedule 25.09.2020
comment
Вероятно, у вас есть какая-то глобальная обработка ошибок. Вы можете использовать историю сообщений (docs.spring.io/spring-integration/docs/5.3.2.RELEASE/reference/) и глобальное прослушивание с помощью адаптера канала ведения журнала для отслеживания перемещения ваших сообщений. Таким образом, вы увидите в журналах, где ваше сообщение идет после этого проблемного Jpa.retrievingGateway() (если есть). - person Artem Bilan; 25.09.2020