ActiveMQ 5 + Wildfly 11

В сети великое множество мануалов, рассказывающие нам невероятную повесть о том, как подружить ActiveMQ и WildFly. Но в основном, они все на английском и не работают. Из 8 прочитанных мной мануалов, 8 не привели меня к победе, конечно, в них было много полезного. Возможно, так обстоят дела потому, что все описывают работу с разными версиями, вот и мне пришлось пройтись по этим граблям.
Установка сервера ActiveMQ
Если сервер ActiveMQ у вас уже стоит, смело пропускайте эту часть. На момент выхода статьи, доступен ActiveMQ версии 5.
1) Скачаем сервер ActiveMQ с официального сайта и куда-нибудь распакуем.
2) Определим пользователей в файле conf/jetty-realm.properties, используя образец внутри.
Сервер ActiveMQ кроссплатформенное приложение и в папке bin находим версии для Windows и Linux.
3) Запустим скрипт с параметром start.
cd bin
./activemq start4) Если все сделано верно, можно посетить админку http://localhost:8161/admin/

О WildFly
Все описанное далее выполнялось и проверялось на чистой копии WildFLy 11, запущенной в режиме standalone и взятой с официального сайта . Адаптер ActiveMQ требует профиля WildFly уровня не ниже full, поэтому необходимо запускать WildFly c параметром -c standalone-full.xml
cd bin
./standalone.sh -c standalone-full.xmlУстанавливаем Resource Adapter
1) Получим с официального сайта файл activemq-rar-5.11.1.rar, для данного мануала нужна именно эта версия.
Не путать с архиватором Александра Рошала, в данном случае расширение rar указывает на специальный тип файла resource adapter, который традиционно упакован в zip. Да, да! Файл с расширением rar, является архивом zip.
2) Распакуем содержимое activemq-rar-5.11.1.rar в папку modules/org/apache/activemq/ra/main/, в эту же папку подкладываем файл Скачать 1.8 КБmodule.xml - файл, с прописанными зависимостями, устанавливаемого модуля в WildFly, приложенный подходит только для версии адаптера 5.11.1, для другой версии адаптера вы можете сделать его самостоятельно, по аналогии.
3) Задеплоим файл activemq-rar-5.11.1.rar на WildFly, подложив его в папку standalone/deployments.
4) Поправим конфиг standalone-full.xml, располагающийся в папке standalone/configuration.
5) Заменим секцию urn:jboss:domain:resource-adapters на:
<subsystem xmlns="urn:jboss:domain:resource-adapters:5.0">
<resource-adapters>
<resource-adapter id="activemq">
<module slot="main" id="org.apache.activemq.ra"/>
<transaction-support>XATransaction</transaction-support>
<config-property name="ServerUrl">
tcp://localhost:61616?jms.rmIdFromConnectionId=true
</config-property>
<config-property name="UserName">
admin
</config-property>
<config-property name="Password">
admin
</config-property>
<config-property name="UseInboundSession">
false
</config-property>
<connection-definitions>
<connection-definition class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory" jndi-name="java:/ConnectionFactory" enabled="true" pool-name="ConnectionFactory">
<xa-pool>
<min-pool-size>1</min-pool-size>
<max-pool-size>20</max-pool-size>
<prefill>false</prefill>
<is-same-rm-override>false</is-same-rm-override>
</xa-pool>
<timeout>
<idle-timeout-minutes>1</idle-timeout-minutes>
</timeout>
<validation>
<background-validation>true</background-validation>
</validation>
</connection-definition>
</connection-definitions>
<admin-objects>
<admin-object class-name="org.apache.activemq.command.ActiveMQQueue" jndi-name="java:/queue/TestQueue" use-java-context="true" pool-name="TestQueue">
<config-property name="PhysicalName">TestQueue</config-property>
</admin-object>
<admin-object class-name="org.apache.activemq.command.ActiveMQTopic" jndi-name="java:/topic/TestTopic" use-java-context="true" pool-name="TestTopic">
<config-property name="PhysicalName">TestTopic</config-property>
</admin-object>
</admin-objects>
</resource-adapter>
</resource-adapters>
</subsystem>6) Заменим секцию urn:jboss:domain:messaging-activemq на:
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0"/>7) Изменим секцию urn:jboss:domain:ejb3:
<subsystem xmlns="urn:jboss:domain:ejb3:5.0">
...
<mdb>
<resource-adapter-ref resource-adapter-name="activemq"/>
...
</mdb>
...
</subsystem>Пишем HelloWorld.war
В этот раз, я не буду приводить весь код, но отмечу основные моменты. Вы можете сразу скачать Скачать 4.1 КБsrc-helloworld-activemq-mdb.zipСкачать 4.1 КБsrc-helloworld-activemq-mdb.zip . Отправка сообщений производится силами встроенного сервлета, достаточно пройти по адресу http://localhost:8080/helloworld-activemq-mdb/jms/. Если всё настроено верно, в консоле WildFly появится тестовое сообщение.
Приём сообщений.
Вы можете не указывать раздел <admin-objects> в секции urn:jboss:domain:resource-adapters, если требуется реализовать исключительно приём сообщений.
@MessageDriven(name = "TestQueue", activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destination", propertyValue = "TestQueue"),
@ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") })
public class Consumer implements MessageListener {
public void onMessage(Message rcvMessage) {
...
}
}Отправка сообщений:
public class Producer extends HttpServlet {
@Resource(lookup = "java:/ConnectionFactory")
ConnectionFactory cf;
@Resource(lookup = "java:/queue/TestQueue")
private Queue queue;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Connection connection = null;
connection = cf.createConnection();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageProducer publisher = session.createProducer(queue);
connection.start();
TextMessage message = session.createTextMessage("Hello!");
publisher.send(message);
...
}
}Скачать 31.0 КБstandalone-full.xml
Скачать 1.8 КБmodule.xml
Скачать 4.1 КБsrc-helloworld-activemq-mdb.zip



