Внутреннее исключение происходит в методе org.springframework.integration.dsl.filter (...) - PullRequest
0 голосов
/ 24 апреля 2019

Мы заметили, что в сообщениях 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 с стеком трассировки.

...