Извлечь подробности сообщения в 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,

Другие вопросы по тегам