服务器关闭后如何重新连接Rabbit MQ?

时间:2017-12-05 12:43:29

标签: spring-boot rabbitmq

我有一个使用Rabbit RPC的spring-boot应用程序。 问题是如果应用程序启动,那么Rabbit服务器会关闭,应用程序不会重新连接服务器。如果应用程序在兔子服务器关闭时启动,它会失败,并且在Rabbit再次启动后不会尝试重新连接到Rabbit。 这是配置代码

@Configuration
public class RabbitConfiguration {

@Value("${spring.rabbitmq.host}")
private String rabbitmqHost;

@Value("${spring.rabbitmq.queue}")
private String rabbitmqQueue;

@Value("${spring.rabbitmq.username}")
private String rabbitmqUsername;

@Value("${spring.rabbitmq.password}")
private String rabbitmqPassword;

private final CommentsServiceRpc commentsServiceRpc;


public RabbitConfiguration(final CommentsServiceRpc commentsServiceRpc) {
    this.commentsServiceRpc = commentsServiceRpc;
}

@Bean
public Connection rabbitmqConnection() throws IOException, TimeoutException {
    ConnectionFactory factory = new ConnectionFactory();
    factory.setHost(rabbitmqHost);
    factory.setUsername(rabbitmqUsername);
    factory.setPassword(rabbitmqPassword);
    return factory.newConnection();
}

@Bean
public Channel rpcChanel() throws IOException, TimeoutException {
    Connection connection = rabbitmqConnection();
    Channel channel = connection.createChannel();
    channel.queueDeclare(rabbitmqQueue, false, false, false, null);
    return channel;
}

@Bean("commentsJsonRpcServer")
@Lazy(false)
public JsonRpcServer commentsJsonRpcServer() throws IOException, TimeoutException {
    JsonRpcServer jsonRpcServer = new JsonRpcServer(rpcChanel(), rabbitmqQueue, CommentsServiceRpc.class,
            commentsServiceRpc);
    new Thread(() -> {
        try {
            jsonRpcServer.mainloop();
        } catch (Exception e) {
            System.out.println(e);
        }
    }).start();
    return jsonRpcServer;
}
}

如果Rabbit服务器出现故障并重新启动,如何判断Spring-boot是否尝试重新连接?

1 个答案:

答案 0 :(得分:0)

我不知道关于Spring Boot的第一件事,但是this answer looks promising -

我遇到了类似的问题,你只需要在连接工厂配置上放置一个属性。

根据文章here在工厂设置factory.setAutomaticRecoveryEnabled(true);factory.setNetworkRecoveryInterval(10000);,当兔子服务器关闭或连接丢失时,兔子客户端将尝试重新连接。

因为您正在为连接工厂使用弹簧配置,所以连接工厂将类似于以下

<bean id="connectionFactory"
      class="org.springframework.amqp.rabbit.connection.CachingConnectionFactory">
    <constructor-arg value="somehost"/>
    <property name="username" value="guest"/>
    <property name="password" value="guest"/>
    <property name="automaticRecoveryEnabled" value="true"/>
    <property name="networkRecoveryInterval" value="100000"/>
</bean>

连接工厂参考here