У меня есть следующая установка:
- Интеграция 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}]