RabbitMQ Spring Boot 应用程序处理代理关闭 [英] RabbitMQ Spring Boot application handle broker down
问题描述
我有一个 Spring Boot 应用程序配置为连接到本地 RabbitMQ 代理.我还配置了一个 FixedBackOff
策略,以便在 3 次尝试失败后停止重试连接.
I have a Spring Boot application configured to connect to a local RabbitMQ broker. I have also configured a FixedBackOff
strategy in order to stop retrying connecting after 3 unsuccessful attempts.
编辑 1:我对 FixedBackOff
有以下配置,正如@gary-russell 在 此处:
EDIT 1: I have the following configuration for FixedBackOff
as explained by @gary-russell in here:
@Bean(name = "rabbitListenerContainerFactory")
public SimpleRabbitListenerContainerFactory simpleRabbitListenerContainerFactory(
SimpleRabbitListenerContainerFactoryConfigurer configurer,
ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
configurer.configure(factory, connectionFactory);
BackOff recoveryBackOff = new FixedBackOff(5000, 3);
factory.setRecoveryBackOff(recoveryBackOff);
return factory;
}
使用此配置,我不断在控制台中收到 ConnectionException
:
With this configuration, I keep getting a ConnectionException
in the console:
2018-04-16 13:48:29.769 WARN 54952 --- [nfoReplicator-0] o.s.b.a.health.RabbitHealthIndicator : Health check failed
org.springframework.amqp.AmqpConnectException: java.net.ConnectException: Connection refused
at org.springframework.amqp.rabbit.support.RabbitExceptionTranslator.convertRabbitAccessException(RabbitExceptionTranslator.java:62)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:368)
at org.springframework.amqp.rabbit.connection.CachingConnectionFactory.createConnection(CachingConnectionFactory.java:573)
at org.springframework.amqp.rabbit.core.RabbitTemplate.doExecute(RabbitTemplate.java:1430)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1411)
at org.springframework.amqp.rabbit.core.RabbitTemplate.execute(RabbitTemplate.java:1387)
at org.springframework.boot.actuate.health.RabbitHealthIndicator.getVersion(RabbitHealthIndicator.java:49)
at org.springframework.boot.actuate.health.RabbitHealthIndicator.doHealthCheck(RabbitHealthIndicator.java:45)
at org.springframework.boot.actuate.health.AbstractHealthIndicator.health(AbstractHealthIndicator.java:43)
at org.springframework.boot.actuate.health.CompositeHealthIndicator.health(CompositeHealthIndicator.java:68)
at org.springframework.cloud.netflix.eureka.EurekaHealthCheckHandler.getHealthStatus(EurekaHealthCheckHandler.java:103)
at org.springframework.cloud.netflix.eureka.EurekaHealthCheckHandler.getStatus(EurekaHealthCheckHandler.java:99)
at com.netflix.discovery.DiscoveryClient.refreshInstanceInfo(DiscoveryClient.java:1362)
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:100)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.ConnectException: Connection refused
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at com.rabbitmq.client.impl.SocketFrameHandlerFactory.create(SocketFrameHandlerFactory.java:50)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:907)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:859)
at com.rabbitmq.client.ConnectionFactory.newConnection(ConnectionFactory.java:799)
at org.springframework.amqp.rabbit.connection.AbstractConnectionFactory.createBareConnection(AbstractConnectionFactory.java:352)
... 19 common frames omitted
因此应用程序不会启动并继续打印此异常.即使代理关闭,我如何启动此应用程序?
Therefore the application does not go up and keeps on printing this exception. How can I start this application even when the broker is down?
推荐答案
我是这样做的:
@Configuration
@EnableRabbit
public class AmqpConfiguration {
@Bean
public SimpleRabbitListenerContainerFactory rabbitListenerContainerFactory(ConnectionFactory connectionFactory) {
SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
ExponentialBackOff recoveryBackOff = new ExponentialBackOff();
factory.setRecoveryBackOff(recoveryBackOff);
return factory;
}
}
使用 BackOffExponencial 类,您的服务器将检查 rabbitMq 是否在线.此服务将按指数级时间进行检查,并且永远不会停止.
Using the BackOffExponencial class, your server will check whether rabbitMq is online. This service will check in exponential time and it will never stop.
示例:
对于 10 次尝试,顺序如下:
For 10 attempts the sequence will be as follows:
请求 # ... 退出
request # ... back off
1 ..... 2000
1 ................. 2000
2 ..... 3000
2 ................. 3000
3 ..... 4500
3 ................. 4500
4 ..... 6750
4 ................. 6750
5 ...... 10125
5 ................. 10125
6 ...... 15187
6 ................. 15187
7 ..... 22780
7 ................. 22780
8 ..... 30000
8 ................. 30000
9 ..... 30000
9 ................. 30000
10 ...... 30000
10 ................. 30000
这篇关于RabbitMQ Spring Boot 应用程序处理代理关闭的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!