Извлечь подробности сообщения в Spring RecoveryCallback
Я публикую сообщения в RabbitMQ, и я хотел бы отслеживать ошибки, когда RabbitMQ не работает, для этого я добавил один RetryTemplate
с обратным вызовом восстановления, но обратный вызов восстановления обеспечивает только этот метод getLastThrowable()
и я не уверен, как предоставить подробную информацию о сообщениях, которые не удалось, когда RabbitMQ не работает. (согласно документации " RecoveryCallback
несколько ограничен в том, что контекст повторения содержит толькоlastThrowable
поле. Для более сложных случаев, вы должны использовать внешнийRetryTemplate
чтобы вы могли передать дополнительную информацию RecoveryCallback
через атрибуты контекста "), но я не знаю, как это сделать, если кто-нибудь может мне помочь с одним примером, который будет потрясающим.
Шаблон кролика
public RabbitTemplate rabbitMqTemplate(RecoveryCallback publisherRecoveryCallback) {
RabbitTemplate r = new RabbitTemplate(rabbitConnectionFactory);
r.setExchange(exchangeName);
r.setRoutingKey(routingKey);
r.setConnectionFactory(rabbitConnectionFactory);
r.setMessageConverter(jsonMessageConverter());
RetryTemplate retryTemplate = new RetryTemplate();
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(500);
backOffPolicy.setMultiplier(10.0);
backOffPolicy.setMaxInterval(10000);
retryTemplate.setBackOffPolicy(backOffPolicy);
r.setRetryTemplate(retryTemplate);
r.setRecoveryCallback(publisherRecoveryCallback);
return r;
}
Восстановление Callback
@Component
public class PublisherRecoveryCallback implements RecoveryCallback<AssortmentEvent> {
@Override
public AssortmentEvent recover(RetryContext context) throws Exception {
log.error("Error publising event",context.getLastThrowable());
//how to get message details here??
return null;
}
}
AMQP исходящий адаптер
return IntegrationFlows.from("eventsChannel")
.split()
.handle(Amqp.outboundAdapter(rabbitMqTemplate)
.exchangeName(exchangeName)
.confirmCorrelationExpression("payload")
.confirmAckChannel(ackChannel)
.confirmNackChannel(nackChannel)
)
.get();
1 ответ
Это невозможно, потому что функция RabbitTemplate.execute()
уже не знает о отправляемом вами сообщении, потому что оно может быть выполнено любым другим способом, где у нас может не быть сообщений для обработки:
return this.retryTemplate.execute(
(RetryCallback<T, Exception>) context -> RabbitTemplate.this.doExecute(action, connectionFactory),
(RecoveryCallback<T>) this.recoveryCallback);
То, что я предлагаю вам сделать, это как сохранить сообщение ThreadLocal
прежде чем отправить и получить его от вашего обычая RecoveryCallback
,