Мы заметили, что в сообщениях DLQ отсутствует стек трассировки в RabbitMq, когда возникла исключительная ситуация во время выполнения в области выполнения метода org.springframework.integration.dsl.IntegrationFlowDefinition.filter (...).
Например, используя следующий фрагмент кода:
@Bean
IntegrationFlow accountingMovementFlow(final Function<AccountingMovement, AccountingMovement> tranMoveMapValEnricher, final MessageChannel auditDiscardChannel, final Clock clock
) {
return from("dltmvChannel")
.transform(Message.class, message -> (Message<?>) MessageBuilder.fromMessage(message)
.setHeader(SINK_STARTED_TIMESTAMP, LocalDateTime.ofInstant(clock.instant(), ZoneId.of("UTC")).toString())
.build())
.transform(new AccountingMovementMapper())
.filter(AccountingMovement::isValidOperationType,
discardFlow -> discardFlow.discardChannel(auditDiscardChannel))
.filter(AccountingMovement.class, accountingMovement -> accountingMovement.getAccountBusinessDate().isBefore(accountingMovement.getMovementEffectiveDate()),
discardFlow -> discardFlow.discardChannel(auditDiscardChannel))
.transform(tranMoveMapValEnricher::apply)
.filter(AccountingMovement.class, accountingMovement -> !accountingMovement.isExistingMovement(),
discardFlow -> discardFlow.discardChannel(auditDiscardChannel))
.channel("accountingMovementEnricherChannel")
.get();
}
Предположим, что AccountBusinessDate имеет значение null.Выполнение accountingMovement.getAccountBusinessDate (). IsBefore (accountingMovement.getMovementEffectiveDate ()) немедленно вызовет исключение NullPointerException.В этом случае сообщение, которое поступает в «dltmvChannel», будет храниться в DLQ со стеком трассировки.Однако этого не происходит.
Мы отследили / отладили метод .filter (...) и обнаружили, что внутреннее выполнение фактически вызывает другое исключение синтаксического анализа, поскольку исходное исключение времени выполнения всплывает.В результате в сообщении DLQ отсутствует стек трассировки.
Мы не видим такого поведения в других методах org.springframework.integration.dsl.IntegrationFlowDefinition.Например, если tranMoveMapValEnricher :: apply вызывает исключение времени выполнения во время выполнения org.springframework.integration.dsl.IntegrationFlowDefinition.transform (...), сообщение получает DLQ с стеком трассировки.