首页 > 解决方案 > 如何及时(每10分钟)从微服务(SpringBoot)连接到RabbitMQ 3次

问题描述

我的 Java 微服务(SpringBoot 应用程序)检测到由于 RabbitMQ 关闭而丢失的 RabbitMQ 连接。但是它应该如何在一定时间后尝试重新连接(例如 3 秒,3 次)。如果 3 次尝试后仍然无法连接,那么如何触发邮件。

标签: spring-bootrabbitmqspring-rabbit

解决方案


因为您使用的是 Spring Boot,所以您可以使用 Spring Retry 功能。

我不了解 RabbitMQ,因此代码仅供您提出想法(不会编译)。

假设您有一个尝试连接到 RabbitMQ 的方法,或者尝试向 RabbitMQ 发送一些东西:

@Retryable(value = {RabbitMQConnectinTimeoutException.class},
           maxAttempts = 3, 
           backoff = @Backoff (3000))
public boolean sendRabbitMQmessage(final String message) {
    RabbitMQConnection.sendMessage(message); // this method can throw RabbitMQConnectinTimeoutException
}

使用@Retryable注解,当方法抛出 RabbitMQConnectinTimeoutException 时,Spring 将重试您的方法 3 次,回退时间为 3000 毫秒。

3 次尝试后,如果 RabbitMQConnectinTimeoutException 仍然发生,则该sendEmail方法将被执行,因为@Recover

@Recover
public void sendEmail(RabbitMQConnectinTimeoutException e) {
    Email.send(YOUR_EMAIL_MESSAGE);
}

在上面的示例中,我假设您是sendRabbitMQmessage从另一个@Service. 如果您想每 10 分钟运行一次此方法,则还应使用sendRabbitMQmessage以下注释@Scheduled

@Scheduled(fixedDelayString = "600000", initialDelayString = "1000")
@Retryable(value = {RabbitMQConnectinTimeoutException.class}
           maxAttempts = 3, 
           backoff = @Backoff (3000))
public boolean sendRabbitMQmessage(final String message) { ... }

推荐阅读