Если выполняется рестарт брокера, то после его включения, необходимо проверить наличие подписчика на очередях. Если подписчика нет, то необходимо перезапустить сервер приложений с СМ.

Содержание

1. Установка Artemis MQ:

1.1. Установка базовых пакетов

yum -y install java-1.8.0-openjdk-headless
yum -y install libaio

1.2. Скачать дистрибутив с сайта https://activemq.apache.org/artemis/past-releases.html. Версию дистрибутива можно брать последнюю.

1.3. Расположить дистрибутив в каталоге /opt/

1.4. Выполнить переход в каталог расположения дистрибутива и разархивировать его:

cd /opt/
tar -xzf apache-artemis-2.6.2-bin.tar.gz
mv apache-artemis-2.6.2 artemis

1.5. Выполнить установку:

где, 127.0.0.1 заменить на ip сервера, на котором выполняется установка Artemis MQ

/opt/artemis/bin/artemis create addresses 127.0.0.1 --allow-anonymous --user admin --password admin --host 127.0.0.1 /opt/broker

1.6. Указать в файле bootstrap.xml, пример расположения /opt/broker/etc/, ip и port, на которых будет доступен административный интерфейс:

host - сервер, на котором выполняется установка Artemis MQ

port - используется в url в браузере для доступа к интерфейсу брокера

Пример: http://host:port/console/login

<web bind="http://host:port" path="web">

Указать в файле jolokia-access.xml, пример расположения /opt/broker/etc/, набор подсетей для доступа к веб-интерфейсу:

К примеру, если доступ нужен только из сети интертраст:

<allow-origin>*://169.254.*</allow-origin>

1.7. Отредактировать в broker.xml, пример расположения /opt/broker/etc/, блок <address-settings>..</address-settings> до вида:

(можно полностью заменить блок куском ниже)

<address-settings>
         <!-- if you define auto-create on certain queues, management has to be auto-create -->
         <address-setting match="activemq.management#">
            <dead-letter-address>DLQ</dead-letter-address>
            <expiry-address>ExpiryQueue</expiry-address>
            <redelivery-delay>0</redelivery-delay>
            <!-- with -1 only the global-max-size is in use for limiting -->
            <max-size-bytes>-1</max-size-bytes>
            <message-counter-history-day-limit>10</message-counter-history-day-limit>
            <address-full-policy>PAGE</address-full-policy>
            <auto-create-queues>true</auto-create-queues>
            <auto-create-addresses>true</auto-create-addresses>
            <auto-create-jms-queues>true</auto-create-jms-queues>
            <auto-create-jms-topics>true</auto-create-jms-topics>
         </address-setting>
         <!--default for catch all-->
         <address-setting match="#">
            <dead-letter-address>DLQ</dead-letter-address>
            <expiry-address>ExpiryQueue</expiry-address>
            <redelivery-delay>0</redelivery-delay>
            <!-- with -1 only the global-max-size is in use for limiting -->
            <max-size-bytes>-1</max-size-bytes>
            <message-counter-history-day-limit>10</message-counter-history-day-limit>
            <address-full-policy>PAGE</address-full-policy>
            <auto-create-queues>true</auto-create-queues>
            <auto-create-addresses>true</auto-create-addresses>
            <auto-create-jms-queues>true</auto-create-jms-queues>
            <auto-create-jms-topics>true</auto-create-jms-topics>
         </address-setting>
         <address-setting match="jms.queue.to-am">
            <dead-letter-address>DLQ</dead-letter-address>
            <expiry-address>ExpiryQueue</expiry-address>
            <redelivery-delay>60000</redelivery-delay>
            <max-delivery-attempts>3</max-delivery-attempts>
            <redelivery-delay-multiplier>2.0</redelivery-delay-multiplier>
            <!-- with -1 only the global-max-size is in use for limiting -->
            <max-size-bytes>-1</max-size-bytes>
            <message-counter-history-day-limit>10</message-counter-history-day-limit>
            <address-full-policy>PAGE</address-full-policy>
            <auto-create-queues>true</auto-create-queues>
            <auto-create-addresses>true</auto-create-addresses>
            <auto-create-jms-queues>true</auto-create-jms-queues>
            <auto-create-jms-topics>true</auto-create-jms-topics>
         </address-setting>
         <address-setting match="jms.queue.am-to-any">
        <expiry-address/>
        <expiry-delay>10000</expiry-delay>
            <redelivery-delay>60000</redelivery-delay>
            <max-delivery-attempts>3</max-delivery-attempts>
            <redelivery-delay-multiplier>2.0</redelivery-delay-multiplier>
            <!-- with -1 only the global-max-size is in use for limiting -->
            <max-size-bytes>-1</max-size-bytes>
            <message-counter-history-day-limit>10</message-counter-history-day-limit>
            <address-full-policy>PAGE</address-full-policy>
            <auto-create-queues>true</auto-create-queues>
            <auto-create-addresses>true</auto-create-addresses>
            <auto-create-jms-queues>true</auto-create-jms-queues>
            <auto-create-jms-topics>true</auto-create-jms-topics>
         </address-setting>
         <address-setting match="jms.topic.chlog">
            <dead-letter-address>DLQ</dead-letter-address>
            <expiry-address>ExpiryQueue</expiry-address>
            <redelivery-delay>60000</redelivery-delay>
            <max-delivery-attempts>3</max-delivery-attempts>
            <redelivery-delay-multiplier>2.0</redelivery-delay-multiplier>
            <!-- with -1 only the global-max-size is in use for limiting -->
            <max-size-bytes>-1</max-size-bytes>
            <message-counter-history-day-limit>10</message-counter-history-day-limit>
            <address-full-policy>PAGE</address-full-policy>
            <auto-create-queues>true</auto-create-queues>
            <auto-create-addresses>true</auto-create-addresses>
            <auto-create-jms-queues>true</auto-create-jms-queues>
            <auto-create-jms-topics>true</auto-create-jms-topics>
         </address-setting>
         <address-setting match="DLQ">
            <expiry-address/>
            <expiry-delay>172800000</expiry-delay> <!-- 2 days -->
         </address-setting>
      </address-settings>
1.8. Выключить firewalld (у заказчиков, у кого разрешено выключение. Если выключать нельзя необходимо попросить заказчика прописать исключения)
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
 
[root@localhost ~]# nano /etc/selinux/config
 
Поправить в файле параметр:
 
SELINUX=disabled

1.9. Проверить значение параметра max-disk-usage в broker.xml, пример расположения /opt/broker/etc/

<!-- once the disk hits this limit the system will block, or close the connection in certain protocols
 that won't support flow control. -->
 <max-disk-usage>90</max-disk-usage>

Скорректировать его при необходимости. Данный параметр регулирует блокировку обращений к брокеру, когда дисковое пространство меньше указанного значения в %.

То есть, если свободного пространства на дисках будет меньше 90%, как указано выше, то сервер приложений с СМ не сможет достучаться до Брокера. В логе будут ошибки вида:

2020-01-10 12:23:42,472 WARN [org.apache.activemq.artemis.core.client] (pool-12-thread-1) AMQ212054: Destination address=jms.topic.ClusterNotificationTopic is blocked. If the system is configured to block make sure you consume messages on this configuration.
2020-01-10 12:23:52,472 WARN [org.apache.activemq.artemis.core.client] (pool-12-thread-1) AMQ212054: Destination address=jms.topic.ClusterNotificationTopic is blocked. If the system is configured to block make sure you consume messages on this configuration.

.

.

2020-01-10 12:24:07,160 WARN [org.infinispan.configuration.parsing.Parser80] (ServerService Thread Pool -- 88) ISPN000383: The eviction max-entries attribute has been deprecated. Please use the size attribute instead
2020-01-10 12:24:07,161 WARN [org.infinispan.configuration.parsing.Parser80] (ServerService Thread Pool -- 88) ISPN000383: The eviction max-entries attribute has been deprecated. Please use the size attribute instead

2. Запуск брокера.

Настройка службы и добавление ее в автозапуск (брокер будет запускаться перед wildfly, если установка обоих компонентов выполнялась на одном сервере):

nano /etc/systemd/system/artemis.service

Содержимое artemis.service:

[Unit]
Description=Artemis Server
After=syslog.target network.target
Before=wildfly.service
[Service]
User=root
PIDFile=/opt/broker/data/artemis.pid
ExecStart=/opt/broker/bin/artemis-service start
ExecStop=/opt/broker/bin/artemis-service stop
StandardOutput=null
[Install]
WantedBy=multi-user.target

Теперь, для старты / остановки / проверки статуса службы необходимо использовать команды:

systemctl start artemis

systemctl stop artemis

systemctl status artemis

Добавление службы в автозагрузку:  

systemctl enable artemis

3. Создание скрипта

Создаем .sh скрипт на сервере Artemis MQ (к примеру, /opt/artemis.sh) и запускаем его.

Для запуска скрипта необходимо, чтобы брокер был запущен!

Выполнить переход в каталог /opt, создать .sh скрипт:

`hostname` - параметр по умолчанию редактировать не нужно. Но, если возникнет ошибка при исполнении скрипта, то место `hostname` указать ip сервера установки Artemis MQ.

61616 - порт, используемый по умолчанию. Указан в конфиге broker.xml, пример расположения /opt/broker/etc, блок <acceptor name="artemis"..</acceptor>

host=tcp://`hostname`:61616
   
topics="ConfigurationUpdateTopic ClusterNotificationTopic chlog am-to-many"
queues="ClusterNotificationDelayQueue cmjBusinessQueue am-to-any to-am"
   
for t in $topics; do
/opt/artemis/bin/artemis address create \
 --multicast \
 --no-anycast \
 --name jms.topic.$t \
 --url $host
done
   
for q in $queues; do
/opt/artemis/bin/artemis queue create \
 --anycast \
 --no-durable \
 --preserve-on-no-consumers \
 --auto-create-address \
 --address jms.queue.$q \
 --name jms.queue.$q \
 --url $host
done

Важно: нельзя выделять для копирования содержимое скрипта двойным кликом, иначе в строки будут добавлены некорректные пробелы

Сохранить скрипт, выдать права на запуск:

[root@host_artemis opt]# chmod 777 ./artemis.sh

Выполнить запуск скрипта .sh:

[root@host_artemis opt]# ./artemis.sh

[root@localhost opt]# ./artemis.sh
Address [name=jms.topic.ConfigurationUpdateTopic, routingTypes={MULTICAST}, autoCreated=false] created successfully.
Address [name=jms.topic.ClusterNotificationTopic, routingTypes={MULTICAST}, autoCreated=false] created successfully.
Address [name=jms.topic.chlog, routingTypes={MULTICAST}, autoCreated=false] created successfully.
Queue [name=jms.queue.ClusterNotificationDelayQueue, address=jms.queue.ClusterNotificationDelayQueue, routingType=ANYCAST, durable=false, purgeOnNoConsumers=false, autoCreateAddress=false, exclusive=false, lastValue=false, lastValueKey=null, nonDestructive=false, consumersBeforeDispatch=0, delayBeforeDispatch=-1, autoCreateAddress=false] created successfully.
Queue [name=jms.queue.cmjBusinessQueue, address=jms.queue.cmjBusinessQueue, routingType=ANYCAST, durable=false, purgeOnNoConsumers=false, autoCreateAddress=false, exclusive=false, lastValue=false, lastValueKey=null, nonDestructive=false, consumersBeforeDispatch=0, delayBeforeDispatch=-1, autoCreateAddress=false] created successfully.

4. Дополнительные настройки с учетом использования отложенных очередей

4.1. Настройки в broker.xml

В broker.xml должно быть добавлено 2 блока(после выполнения настроек брокер необходимо перезапустить):

<diverts>
   <divert name="chlog-delayed-divert">
      <routing-name>chlog-delayed-divert</routing-name>
      <address>jms.topic.chlog</address>
      <forwarding-address>jms.topic.chlog-delayed</forwarding-address>
      <transformer>
         <class-name>ru.intertrust.artemis.server.transformer.DelayDeliveryTransformer</class-name>
         <property key="delay" value="15000"/> <!-- 15 сек.-->
      </transformer>
      <exclusive>false</exclusive>
   </divert>
</diverts>

и

<address-setting match="jms.topic.chlog-delayed">
   <dead-letter-address>DLQ</dead-letter-address>
   <expiry-address>ExpiryQueue</expiry-address>
   <redelivery-delay>15000</redelivery-delay>
   <max-delivery-attempts>5</max-delivery-attempts>
   <redelivery-delay-multiplier>1.0</redelivery-delay-multiplier>
   <!-- with -1 only the global-max-size is in use for limiting -->
   <max-size-bytes>-1</max-size-bytes>
   <message-counter-history-day-limit>10</message-counter-history-day-limit>
   <address-full-policy>PAGE</address-full-policy>
   <auto-create-queues>true</auto-create-queues>
   <auto-create-addresses>true</auto-create-addresses>
   <auto-create-jms-queues>true</auto-create-jms-queues>
   <auto-create-jms-topics>true</auto-create-jms-topics>
</address-setting>

4.2. Положить в папку lib delay-delivery-transformer.jar

4.3. Настройки в интерфейсе менеджера агентов

Создать ещё одну JMS-Очередь с названием jms.topic.chlog-delayed

Данную очередь необходимо выбрать в  настройке запуска 

4.4. Скрипт создания топика на брокере

После выполнения настроек(или можно заранее), если топик chlog-delayed не создался автоматически, выполнить скрипт для создания

host=tcp://`hostname`:61616
topics="chlog-delayed"
/opt/artemis/bin/artemis address create \
        --multicast \
        --no-anycast  \
        --name jms.topic.chlog-delayed \
        --url $host

5. Интерфейс брокера

Войти в интерфейс брокера можно по ссылке

http://host_artemis.inttrust.ru:port_atemis/console/login

см. пункт 1.6 - в нем задается порт для доступа к веб-интерфейсу брокера.

Вид интерфейса: