我有一个使用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是否尝试重新连接?
答案 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