使用嵌入式代理时,我在关机时遇到以下错误:
Exception in thread "ActiveMQ ShutdownHook" java.lang.NoClassDefFoundError: org/apache/activemq/broker/BrokerService
我可能错误配置了什么吗?我使用了activemq页面上拼写的配置:
http://activemq.apache.org/how-do-i-embed-a-broker-inside-a-connection.html
(底部标有“使用spring-2.0”的配置)。消息正在正确传递等等,所以我不确定这个错误是否无害。
答案 0 :(得分:4)
这是一个老问题,当嵌入ActiveMQ并且未100%正确配置时可能会发生这个问题。您链接的配置中唯一遗漏的是将useShutdownHook="false"
添加到XML配置的<broker>
元素。以下是一个简单的例子:
<amq:broker useJmx="false" persistent="false" useShutdownHook="false">
...
</amq:broker>
这将禁用关闭挂钩并防止发生此问题。
答案 1 :(得分:0)
实际上我会启用关闭钩子 - 但必须在正确的位置定义它。有人因某种原因实施了它;)
我不知道你有什么类型的部署,但我们假设是网络应用程序。在这种情况下,您应该在web.xml
中将关闭挂钩注册为ServletContextListener。在这种情况下,它将在Web应用程序关闭期间被触发,并且此时classpath包含所有ActiveMQ类,并且它将按预期工作。
在Web应用程序的情况下在JVM上注册关闭挂钩可能会有问题。关闭期间的Web容器(tomcat)将首先停止Web应用程序,然后将执行JVM关闭挂钩。
ActiveMQ注册自定义线程,这些线程将在Web应用程序停止后继续运行,但是它们将无法访问此Web应用程序中的类(因为它已被销毁),因此您将获得NoClassDefFoundError
。< / p>
还有一件事:也许你可以禁用关机钩子。如果你正在加载ActiveMQ作为Spring Beans并从web.xml
(Spring Web Context)加载Spring上下文,那么Spring将自动注册钩子并正确关闭AcrtiveMQ bean。
答案 2 :(得分:0)
您可以在完成集成测试后停止activemq实例。只需将以下几行添加到pom。
<execution>
<id>stop-activemq</id>
<goals>
<goal>stop</goal>
</goals>
<phase>post-integration-test</phase>
</execution>