Как управлять новым сообщением, содержащим текущий идентификатор корреляции, в потоке исключений

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

Я пробовал так:

@Bean
public IntegrationFlow socialMediaErrorFlow() {
     return IntegrationFlows.from("socialMediaErrorChannel")
           .wireTap(sf -> sf.handle("errorService", "handleException"))
           .handle((p, h) -> MessageBuilder.withPayload(p).copyHeaders(h).setHeader("ERROR", true).build())
           .channel("directChannel_2")
           .get();
}

Но агрегатор возвращает эту ошибку:

MessageHandlingException: error occurred in message handler [org.springframework.integration.dsl.AggregatorSpec$InternalAggregatingMessageHandler#0]; nested exception is java.lang.IllegalStateException: Null correlation not allowed.  Maybe the CorrelationStrategy is failing?

Я не могу скопировать идентификатор корреляции в заголовке сообщения.

Кто-нибудь знает, что я делаю неправильно? Заранее спасибо.


person Sergio Sánchez Sánchez    schedule 26.07.2017    source источник


Ответы (1)


Сообщение, которое поступает в канал ошибок, — ErrorMessage. Его payload (обычно) MessagingException. Тот, в свою очередь, имеет свойство failedMessage.

Вам нужно что-то вроде этого:

.<MessagingException>handle((p, h) -> MessageBuilder.fromMessage(p.getFailedMessage()).setHeader("ERROR", true).build())

Вам не нужно копировать заголовки, потому что они уже есть в файле failedMessage. ErrorMessage не заботятся (и не могут) о заголовках, потому что они просто имеют дело с исключением.

person Artem Bilan    schedule 26.07.2017