Estou procurando implementar um fluxo de integração com um split/aggregate. Gostaria de capturar lançamentos de exceção por manipuladores e iterar todos os elementos divididos um por um, mesmo se algum elemento falhar. Quando todos os elementos lançam exceção e as exceções são capturadas, o fluxo nunca termina. O que eu perdi, por favor? Como posso alcançar o agregado e o fim deste fluxo?
IntegrationFlow.from(
WebFlux.inboundGateway("/jira/version")
.requestMapping(r -> r.methods(HttpMethod.POST)
.consumes("application/json"))
.requestPayloadType(String.class)
.replyChannel(replyChannel)
.errorChannel(errorChannel)
.mappedRequestHeaders(parameter.getJiraHeaderSignature()))
.handle(versionWebhookHandler)
.split(new VersionIssueSplitter())
.handle(updateVersionHandler, s -> s.advice(advice()))
.aggregate()
.get();
public Advice advice() {
var advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setTrapException(true);
return advice;
}
Esta
advice.setTrapException(true);
é a maneira correta de não deixar que essa exceção borbulhe e permitir que o divisor itere naturalmente.Seu problema é com o
.aggregate()
. Embora seja muito conveniente que o divisor e o agregador funcionem em conjunto por padrão, você tem que garantir que realmente todos os elementos cheguem a esse agregador para completar o grupo de mensagens corretamente.Quando você captura (ou simplesmente captura) exceções no tratamento de itens, não há resposta para enviar disso
handle
paraaggregate
. Então, um agregador não pode cumprir os requisitos de conclusão do grupo, portanto seu fluxo nunca termina.Não sabemos quais são suas expectativas, mas aparentemente você tem que emitir qualquer coisa de qualquer forma, mesmo que o tratamento de itens acabe com um erro. Você pode criar algum objeto personalizado para retornar de and
failureExpression
emreturnFailureExpressionResult = true
vez detrapException
. O manipulador então cuidará de envolver esse resultado em uma mensagem com cabeçalhos de detalhes de correlação adequados da solicitação.Então você pode dar uma olhada em:
Para iterar sobre mensagens agrupadas e filtrar aquelas com erros, caso você não precise delas posteriormente.
Veja mais informações sobre detalhes de correlação nos documentos: https://docs.spring.io/spring-integration/reference/aggregator.html