2017-07-28 95 views
0

我有一个作为消息中间件的兔子春天休息的应用程序。当应用程序接受传入的休息请求时,它会回复用户,同时它会异步执行一些额外的处理,生成一条新消息并将其放在兔子身上。从那里,一些消费者阅读消息并将其传递给外部系统。现在,有一种情况是兔子服务器本身可能关闭。 来处理这种失败的,我有一个阻塞队列(当然具有可调整大小)Spring引导和rabbitmq集成,如何恢复组件失败?

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

    return executor; 
} 

队列将能够处理一些邮件,直到兔子联机。但是,如果它太长并且请求超过队列大小,那么它将会失败。现在的问题是,有没有一种方法可以改进并提高效率?什么是行业最佳实践?这种情况下是否有任何模式?

+1

也许春天云端Histrix断路器。 https://martinfowler.com/bliki/CircuitBreaker.html或https://spring.io/guides/gs/circuit-breaker/ –

+0

因此,将消费者和生产者包装在Histrix断路器中可能是有道理的。兔子连接工厂本身呢?如果无法建立连接,则一遍又一遍重试并浪费网络和服务器资源是没有意义的。 – Imran

+1

Spring云流绑定器http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_spring_cloud_stream引入了持久发布 - 订阅语义的概念。默认情况下,RabbitMQ联编程序使用Spring Boot的ConnectionFactory,因此它支持RabbitMQ的所有Spring Boot配置选项。但是,根据我的愚见,如果您是Spring云新手,请首先关注此优秀课程:https://www.udemy.com/microservices-with-spring-cloud/learn/v4/overview –

回答

0

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

@Async 
    @Retryable(value = { AmqpException.class }, 
      maxAttempts=10, [email protected](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); 
    }