在Spring RecoveryCallback中获取消息详细信息

时间:2017-07-26 22:21:47

标签: spring-amqp spring-retry spring-integration-amqp

我正在向RabbitMQ发布消息,我想跟踪RabbitMQ关闭时的错误,为此我添加了一个带有恢复回调的RetryTemplate,但恢复回调仅提供此方法{{1}并且我不确定如何提供RabbitMQ关闭时失败的消息的详细信息。 (根据文档“getLastThrowable()有些限制,因为重试上下文只包含 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;
    }

AMQP出站适配器

@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; } }

1 个答案:

答案 0 :(得分:1)

这是不可能的,因为函数RabbitTemplate.execute()已经不知道您发送的消息,因为它可能是从我们可能没有消息要处理的任何其他方法执行的:

return this.retryTemplate.execute(
                    (RetryCallback<T, Exception>) context -> RabbitTemplate.this.doExecute(action, connectionFactory),
                    (RecoveryCallback<T>) this.recoveryCallback);

我建议您做的就是在发送之前将消息存储到ThreadLocal,然后从您的自定义RecoveryCallback获取消息。