Как активировать функциональность после того, как попытки повторной попытки RabbitMQ закончатся? (Spring Integration - RabbitMQ Listener)
Я хочу инициировать электронную почту после того, как повторные попытки RabbitMQ Listener закончились, и все еще, если процесс обработки не удался.
логика повтора работает с приведенным ниже кодом. Но как активировать функциональность (триггер электронной почты), когда максимальные попытки повторной попытки закончились.
@Bean
public SimpleMessageListenerContainer container() {
SimpleMessageListenerContainer container =
new SimpleMessageListenerContainer(connectionFactory());
container.setQueues(myQueue());
container.setDefaultRequeueRejected(false);
Advice[] adviceArray = new Advice[]{interceptor()};
container.setAdviceChain(adviceArray);
return container;
}
@Bean
public IntegrationFlow inboundFlow() {
return IntegrationFlows.from(
Amqp.inboundAdapter(container()))
.log()
.handle(listenerBeanName, listenerMethodName)
.get();
}
@Bean
RetryOperationsInterceptor interceptor() {
return RetryInterceptorBuilder.stateless()
.maxAttempts(retryMaxAttempts)
.backOffOptions(initialInterval, multiplier, maxInterval)
//.recoverer(new RejectAndDontRequeueRecoverer())
.recoverer(new CustomRejectAndRecoverer())
.build();
}
Добавление с кодом CustomeRecover
@Service
public class CustomRejectAndRecoverer implements MessageRecoverer {
@Autowired
private EmailGateway emailgateway;
@Override
public void recover(Message message, Throwable cause) {
// INSERT CODE HERE.... HOW TO CALL GATEWAY
// emailgateway.sendMail(cause);
throw new ListenerExecutionFailedException("Retry Policy Exhausted",
new AmqpRejectAndDontRequeueException(cause), message);
} }
1 ответ
Решение
Это именно то, что .recoverer()
в этом RetryInterceptorBuilder
для.
Вы используете там сейчас RejectAndDontRequeueRecoverer
, но никто не мешает вам реализовать свой собственный MessageRecoverer
с делегацией в RejectAndDontRequeueRecoverer
и отправив сообщение некоторым MessageChannel
с логикой отправки электронных писем.