【问题标题】:Multiple RabbitMQ Application多个 RabbitMQ 应用程序
【发布时间】:2017-10-23 15:30:24
【问题描述】:

我正在尝试在 Tomcat 服务器上托管多个 Spring Boot 应用程序。 但是,当我尝试启动服务器时,我发现了以下异常。 该问题与具有相同缓存工厂 ID 的多个 rabbitmq 队列有关。 我尝试在 ...Application.class 中创建一个具有不同 id 的 ConnectionFactory bean,但应用程序无法构建。 欢迎任何帮助。

org.springframework.jmx.export.UnableToRegisterMBeanException: Unable to register MBean [CachingConnectionFactory] with key 'rabbitConnectionFactory'; nested exception is javax.management.InstanceAlreadyExistsException: org.springframework.amqp.rabbit.connection:name=rabbitConnectionFactory,type=CachingConnectionFactory
at org.springframework.jmx.export.MBeanExporter.registerBeanNameOrInstance(MBeanExporter.java:628) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.jmx.export.MBeanExporter.registerBeans(MBeanExporter.java:550) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.jmx.export.MBeanExporter.afterSingletonsInstantiated(MBeanExporter.java:432) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:781) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:866) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:542) ~[spring-context-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:737) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:370) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:314) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.run(SpringBootServletInitializer.java:151) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.createRootApplicationContext(SpringBootServletInitializer.java:131) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.web.support.SpringBootServletInitializer.onStartup(SpringBootServletInitializer.java:86) [spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.web.SpringServletContainerInitializer.onStartup(SpringServletContainerInitializer.java:169) [spring-web-4.3.8.RELEASE.jar:4.3.8.RELEASE]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5573) [catalina.jar:7.0.68]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) [catalina.jar:7.0.68]
at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:899) [catalina.jar:7.0.68]
at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:875) [catalina.jar:7.0.68]
at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:652) [catalina.jar:7.0.68]
at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1259) [catalina.jar:7.0.68]
at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1998) [catalina.jar:7.0.68]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) [na:1.8.0_77]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_77]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_77]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_77]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_77]

【问题讨论】:

    标签: java spring spring-boot spring-rabbit


    【解决方案1】:

    如果您想继续使用 JMX,您可以在您的 application.properties 中为其分配一个唯一的 default-domain,如下所示:

    spring.application.name=my-app
    spring.jmx.default-domain=my-app-jmx
    

    找到了这个解决方案here,对我来说效果很好。可以在here找到属性的简要说明。

    【讨论】:

      【解决方案2】:

      在我们的例子中,我们没有专门使用 JMX,也没有依赖 Spring Boot 的任何基于 JMX 的特性。在将多个应用程序部署到同一个容器时,只需禁用 JMX 即可防止名称冲突。

      application.properties:

      spring.jmx.enabled=false
      

      【讨论】:

        【解决方案3】:

        您应该为每个应用程序使用不同的 MBean 域。

        但是,使用不同的 bean 名称创建工厂应该没有问题;您应该编辑您的问题以描述那里问题的性质。

        【讨论】:

        • application.properties 中设置不同的域仅在我使用 @PropertySource 注释设置此文件的路径时才有效。如果我在我的配置类中贴 PropertySourcesPlaceholderConfigurer bean 并在那里设置一个位置,那么我仍然会得到这个异常。
        猜你喜欢
        • 2015-08-12
        • 2023-03-04
        • 1970-01-01
        • 2019-11-20
        • 2019-06-15
        • 1970-01-01
        • 2014-04-12
        • 2020-12-03
        • 1970-01-01
        相关资源
        最近更新 更多