Spring Integration ошибка придает завершенную полезную нагрузку - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть слушатель JMS.После прочтения сообщения я преобразую его в свой пользовательский объект

public IntegrationFlow queueProcessorFlow() {
        return IntegrationFlows.from(Jms.inboundAdapter(jmsTemplate)

                        .destination("test_queue"),
                c -> c.poller(Pollers.fixedDelay(5000L)
                        .maxMessagesPerPoll(1)))

                //convert json to our custom object
                .transform(new JsonToQueueEventConverterTransformer(springBeanFactory))

                .transform(new CustomTransformer(springBeanFactory))


                .handle(o -> {


                }).get();
    }

.Он даже содержит полезную нагрузку.Меня не интересует полезная нагрузка в случае исключения.

Как обновить, чтобы не включать полезную нагрузку?

** Обновление **

После изменения ответа я все еще вижу проблему

org.springframework.integration.transformer.MessageTransformationException: Failed to transform Message; nested exception is org.springframework.messaging.MessageHandlingException: nested exception is org.springframework.integration.transformer.MessageTransformationException: Error initiliazing the :; nested exception is CustomException Error lab lab lab  , failedMessage=GenericMessage [payload=

мой обработчик ошибок

 @Bean
    public IntegrationFlow errorHandlingFlow() {
        return IntegrationFlows.from("errorChannel")
                .handle(message -> {
                    try {

                        ErrorMessage e = (ErrorMessage) message;
                        if (e.getPayload() instanceof MessageTransformationException) {
                            String stackTrace = ExceptionUtils.getStackTrace(e.getPayload());
                            LOG.info("Exception trace {} ", stackTrace);

1 Ответ

0 голосов
/ 03 декабря 2018

Не уверен, какова бизнес-цель потерять payload в трассировке стека, но вы можете добиться этого, выбрасывая MessageTransformationException вместо RuntimeException.

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

public MessageTransformationException(String description, Throwable cause) {
    super(description, cause);
}

public MessageTransformationException(String description) {
    super(description);
}

Вместо основанных на Message<?>.

Таким образом, обтекание MessageTransformingHandler сделаетсоответствующая логика:

protected Object handleRequestMessage(Message<?> message) {
    try {
        return this.transformer.transform(message);
    }
    catch (Exception e) {
        if (e instanceof MessageTransformationException) {
            throw (MessageTransformationException) e;
        }
        throw new MessageTransformationException(message, "Failed to transform Message", e);
    }
}

ОБНОВЛЕНИЕ

Оказалось, что MessageTransformationException недостаточно, поскольку AbstractMessageHandler проверяет MessageHandlingException для переноса вIntegrationUtils.wrapInHandlingExceptionIfNecessary().Поэтому я предлагаю вместо этого выкинуть MessageHandlingException из вашего кода.И используйте этот конструктор с null для сообщения arg:

MessageHandlingException(Message<?> failedMessage, Throwable cause)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...