ActiveMQ встроенный брокер, исключение в ловушке завершения работы - PullRequest
3 голосов
/ 29 ноября 2011

Я получаю следующую ошибку при завершении работы с использованием встроенного брокера:

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

(конфигурация с пометкой «using spring-2.0» внизу).Сообщения доставляются должным образом и т. Д., Поэтому я не уверен, что эта ошибка безвредна.

Ответы [ 3 ]

4 голосов
/ 29 ноября 2011

Это старая проблема, которая может возникнуть, если ActiveMQ встроен и не настроен на 100% правильно.Единственное, что не указано в конфиге, который вы связали, - это добавление useShutdownHook="false" к элементу <broker> конфигурации XML.Ниже приведен краткий пример:

<amq:broker useJmx="false" persistent="false" useShutdownHook="false">
...
</amq:broker>

Это отключит отключение и предотвратит возникновение этой проблемы.

0 голосов
/ 05 июня 2019

Вы можете остановить экземпляр activemq после завершения интеграционных тестов. Просто добавьте следующие строки в ваш pom.

 <execution>
    <id>stop-activemq</id>
    <goals>
        <goal>stop</goal>
    </goals>
    <phase>post-integration-test</phase>
</execution>
0 голосов
/ 14 сентября 2017

На самом деле я бы оставил хук выключения включенным, но он должен быть определен в нужном месте.Кто-то реализовал это по причине;)

Я не знаю, какой тип развертывания у вас, но давайте предположим, веб-приложение.В таком случае вы должны зарегистрировать хук отключения в web.xml как ServletContextListener .В этом случае он будет срабатывать при завершении работы веб-приложения, и в это время путь к классам содержит все классы ActiveMQ, и он будет работать, как и ожидалось.

Регистрация перехвата отключения на JVM в случае веб-приложения может быть проблематичной.Веб-контейнер (tomcat) во время завершения работы сначала останавливает веб-приложения, а затем выполняются ловушки завершения работы JVM.

ActiveMQ регистрирует пользовательские потоки, и они будут продолжать работать после остановки веб-приложения, но они не смогут получить доступ к классам из этого веб-приложения (так как оно было уничтожено), и поэтому вы получите NoClassDefFoundError.

Еще одна вещь: возможно, вы можете отключить отключение крюка.Если вы загружаете ActiveMQ как Spring Beans, а контекст Spring загружается из web.xml (Spring Web Context), то Spring автоматически регистрирует перехватчики и корректно закрывает компоненты AcrtiveMQ.

...