【问题标题】:Spring boot and rabbitmq integration, how to recover on component failure?Spring boot和rabbitmq集成,组件故障如何恢复?
【发布时间】:2018-01-04 10:30:32
【问题描述】:

我有一个用兔子作为消息中间件的 spring rest 应用程序。当应用程序接受传入的休息请求时,它会回复用户,同时它会异步进行一些额外的处理,生成一条新消息并将其放在兔子身上。从那里,一些消费者读取消息并将其传递到外部系统。现在,有一种情况是兔子服务器本身可能已关闭。 为了处理这种故障,我有一个阻塞队列(当然大小可调)

 @Bean
public TaskExecutor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(5);
    executor.setMaxPoolSize(10);
    executor.setQueueCapacity(25);

    return executor;
}

在兔子上线之前,队列将能够处理一些消息。但是如果花费的时间太长并且请求超过了队列大小,那么它将失败。现在的问题是,有没有办法可以改进它并提高效率?什么是行业最佳实践?这种情况有什么模式吗?

【问题讨论】:

标签: spring design-patterns rabbitmq integration messaging


【解决方案1】:

我使用弹簧可重试。这对于要求来说已经足够了。因为我可以重试,配置重试间隔、最大尝试次数等,以及实现自定义恢复功能。

   @Async
    @Retryable(value = { AmqpException.class },
            maxAttempts=10, backoff=@Backoff(delay=100, maxDelay=300000,multiplier = 2))
    public void sendEmailMessageToQueue(SimpleMailMessage email){
        log.info("Sending message to queue"+Thread.currentThread().getName());
        try {
            rabbitTemplate.convertAndSend(queueName, email);
        }catch (AmqpException e){
            log.log(Level.WARNING,"Could not send message to queue, will retry.",e);
        }
    }

    @Recover
    public void connectionException(AmqpException e) {
        log.log(Level.SEVERE,"Could not send message to queue, will save the message in db instead."+Thread.currentThread().getName(),e);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 2013-02-19
    • 2020-03-08
    • 2021-12-02
    相关资源
    最近更新 更多