Java 如果代理关闭,则无法创建Bean

Java 如果代理关闭,则无法创建Bean,java,spring,rabbitmq,amqp,spring-amqp,Java,Spring,Rabbitmq,Amqp,Spring Amqp,我使用Spring AMQP+RabbitMQ。通常,如果rabbitmq服务器关闭,Spring会处理这种情况。应用程序抛出异常,但仍尝试重新连接。然而,如果我将AMQPBean放入另一个bean中,因为它的属性应用程序在启动时失败。我得到这个错误 31 мая 2018 17:31:24.902 [communication-server-0.15.15][o.s.c.s.AbstractApplicationContext.refresh] WARN Exception encounte

我使用Spring AMQP+RabbitMQ。通常,如果rabbitmq服务器关闭,Spring会处理这种情况。应用程序抛出异常,但仍尝试重新连接。然而,如果我将AMQPBean放入另一个bean中,因为它的属性应用程序在启动时失败。我得到这个错误

31 мая 2018 17:31:24.902 [communication-server-0.15.15][o.s.c.s.AbstractApplicationContext.refresh] WARN  Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'driverManager' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:15672/api/queues/": Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused)
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'driverManager' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:15672/api/queues/": Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
  at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
  at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
  at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
  at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
  at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
  at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
  at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)
  at org.springframework.context.support.ClassPathXmlApplicationContext.<init ClassPathXmlApplicationContext.java:139)
  at org.springframework.context.support.ClassPathXmlApplicationContext.<init ClassPathXmlApplicationContext.java:105)
  at ru.ru.Server.run(CommunicationServer.java:36)
  at ru.rubServer.main(CommunicationServer.java:42)
Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://localhost:15672/api/queues/": Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused)
  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:666)
  at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:628)
  at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:303)
  at com.rabbitmq.http.client.Client.getQueues(Client.java:409)
  at ru.rub.DriverManager.removeUnusedQueues(DriverManager.java:340)
  at ru.rub.DriverManager.initialize(DriverManager.java:158)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  at java.lang.reflect.Method.invoke(Method.java:498)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1758)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1695)
  at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624)
  ... 13 more
Caused by: org.apache.http.conn.HttpHostConnectException: Connect to localhost:15672 [localhost/127.0.0.1] failed: В соединении отказано (Connection refused)
  at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:142)
  at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:319)
  at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:363)
  at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:219)
  at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195)
  at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:86)
  at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:108)
  at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:184)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82)
  at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57)
  at org.springframework.http.client.HttpComponentsClientHttpRequest.executeInternal(HttpComponentsClientHttpRequest.java:89)
  at org.springframework.http.client.AbstractBufferingClientHttpRequest.executeInternal(AbstractBufferingClientHttpRequest.java:48)
  at org.springframework.http.client.AbstractClientHttpRequest.execute(AbstractClientHttpRequest.java:53)
  at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:652)
  ... 25 more
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 org.apache.http.conn.socket.PlainConnectionSocketFactory.connectSocket(PlainConnectionSocketFactory.java:72)
  at org.apache.http.impl.conn.HttpClientConnectionOperator.connect(HttpClientConnectionOperator.java:125)
  ... 38 more
31ааааа2018 17:31:24.902[communication-server-0.15.15][o.s.c.s.AbstractApplicationContext.refresh]上下文初始化期间遇到警告异常-取消刷新尝试:org.springframework.beans.factory.BeanCreationException:使用类路径资源中定义的名称“driverManager”创建bean时出错[applicationContext.xml]:调用init方法失败;嵌套异常为org.springframework.web.client.ResourceAccessException:GET请求时发生I/O错误“http://localhost:15672/api/queues/“:连接到本地主机:15672[localhost/127.0.0.1]失败:азззззазазазааза;嵌套异常为org.apache.http.conn.HttpHostConnectException:连接到本地主机:15672[localhost/127.0.0.1]失败:断路器断路器断路器断路器断路器断路器(连接被拒绝)
线程“main”org.springframework.beans.factory.BeanCreationException中出现异常:使用类路径资源[applicationContext.xml]中定义的名称“driverManager”创建bean时出错:调用init方法失败;嵌套异常为org.springframework.web.client.ResourceAccessException:GET请求时发生I/O错误"http://localhost:15672/api/queues/“:连接到本地主机:15672[localhost/127.0.0.1]失败:Сззззззаазазааазааазааазаааааа107
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1628)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:555)
位于org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
位于org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
位于org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
位于org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
位于org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
位于org.springframework.beans.factory.support.DefaultListableBeanFactory.PreInstanceSingleton(DefaultListableBeanFactory.java:761)
位于org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866)
位于org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542)

在org.springframework.context.support.ClassPathXmlApplicationContext.上,您需要显示完整的堆栈跟踪

但是,您可能试图在应用程序上下文完全就绪并刷新之前连接到代理。您不能在
@PostConstruct
方法、
afterPropertiesSet()
方法等中连接到代理


在构建应用程序上下文时,您不应在构建应用程序上下文的线程上对外部系统执行操作。

我没有使用@PostConstruct。您所说的外部系统的操作类型是什么?根据堆栈跟踪,HTTP连接有问题,而不是RabbitMQSee
invokeInitMethods
-
DriverManager.initialize()
正在调用试图通过HTTP调用RabbitMQ的
removeUnusedQueues
。现在这样做还为时过早;您必须等到应用程序上下文完全刷新。
InitMethod
就像
@PostConstruct
;这就是我说的原因。”您也不能在setter、constructor等方法中与外部系统交互@GaryRussell但是如果我的
driverManager
应该包含兔子bean,我该怎么办呢?在那里使用Springbean没有问题;在初始化方法中就不能这样做(或者将它们放入try-catch并安排稍后重试)。一种解决方案是将初始化逻辑移动到
ConnectionListener
,然后将其添加到
CachingConnectionFactory
。成功建立新连接时,将调用侦听器。