代码之家  ›  专栏  ›  技术社区  ›  Yerko Aguirre

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

  •  1
  • Yerko Aguirre  · 技术社区  · 8 年前

    我正在将消息发布到RabbitMQ中,我想在RabbitMQ关闭时跟踪错误,为此我添加了一个 RetryTemplate getLastThrowable() 我不知道如何提供RabbitMQ关闭时失败的消息的详细信息。(根据文件“The RecoveryCallback lastThrowable 领域对于更复杂的用例,您应该使用外部 以便您可以向 恢复回调 但是我不知道怎么做,如果有人能帮我举一个例子的话,那将是很棒的。

    兔子模板

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

    恢复回调

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

    return IntegrationFlows.from("eventsChannel") .split() .handle(Amqp.outboundAdapter(rabbitMqTemplate) .exchangeName(exchangeName) .confirmCorrelationExpression("payload") .confirmAckChannel(ackChannel) .confirmNackChannel(nackChannel) ) .get();

    1 回复  |  直到 8 年前
        1
  •  1
  •   Artem Bilan    8 年前

    由于函数 RabbitTemplate.execute()

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

    我建议您做的是将消息存储到 ThreadLocal 然后从那里从您的客户那里发送和获取 RecoveryCallback