ActiveMQ嵌入式代理,关闭钩子异常

时间:2011-11-29 17:38:33

标签: java spring jms activemq

使用嵌入式代理时,我在关机时遇到以下错误:

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”的配置)。消息正在正确传递等等,所以我不确定这个错误是否无害。

3 个答案:

答案 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>