Ошибка в Spring Boot JMS Producer: AMQ212054 Адрес назначения заблокирован

Я пытаюсь подключиться к удаленному отправителю Artemis 2.6.3 с помощью Spring Boot 2.1.1.RELEASE. Во всех примерах, которые я нашел до сих пор, отправитель зависает при попытке отправить сообщение (например, https://grokonez.com/spring-framework/spring-jms/apache-artemis-produceconsume-jms-messages-springboot-artemis-applications). На консоли отображается следующий журнал:

AMQ212054: Destination address=springbootQueue is blocked. If the system is configured to block make sure you consume messages on this configuration.

Я убедился, что очередь не настроена на БЛОКИРОВАНИЕ в broker.xml. Есть ли какая-нибудь ошибка в spring-boot-starter-artemis / Artemis?

Обновление: мой broker.xml

<?xml version='1.0'?>

<configuration xmlns = "urn:activemq"
               xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
               xmlns:xi = "http://www.w3.org/2001/XInclude"
               xsi:schemaLocation = "urn:activemq /schema/artemis-configuration.xsd">

   <core xmlns = "urn:activemq:core" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation = "urn:activemq:core ">

      <name>0.0.0.0</name>


      <persistence-enabled>true</persistence-enabled>

      <journal-type>ASYNCIO</journal-type>

      <paging-directory>data/paging</paging-directory>

      <bindings-directory>data/bindings</bindings-directory>

      <journal-directory>data/journal</journal-directory>

      <large-messages-directory>data/large-messages</large-messages-directory>

      <journal-datasync>true</journal-datasync>

      <journal-min-files>2</journal-min-files>

      <journal-pool-files>10</journal-pool-files>

      <journal-file-size>10M</journal-file-size>

      <journal-buffer-timeout>156000</journal-buffer-timeout>

      <journal-max-io>4096</journal-max-io>

      <disk-scan-period>5000</disk-scan-period>

      <max-disk-usage>90</max-disk-usage>

      <critical-analyzer>true</critical-analyzer>

      <critical-analyzer-timeout>120000</critical-analyzer-timeout>

      <critical-analyzer-check-period>60000</critical-analyzer-check-period>

      <critical-analyzer-policy>HALT</critical-analyzer-policy>

      <acceptors>

         <!-- Acceptor for every supported protocol -->
         <acceptor name = "artemis">tcp://0.0.0.0:61616?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=CORE,AMQP,STOMP,HORNETQ,MQTT,OPENWIRE;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor>

         <!-- AMQP Acceptor.  Listens on default AMQP port for AMQP traffic.-->
         <acceptor name = "amqp">tcp://0.0.0.0:5672?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=AMQP;useEpoll=true;amqpCredits=1000;amqpLowCredits=300</acceptor>

         <!-- STOMP Acceptor. -->
         <acceptor name = "stomp">tcp://0.0.0.0:61613?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=STOMP;useEpoll=true</acceptor>

         <!-- HornetQ Compatibility Acceptor.  Enables HornetQ Core and STOMP for legacy HornetQ clients. -->
         <acceptor name = "hornetq">tcp://0.0.0.0:5445?anycastPrefix=jms.queue.;multicastPrefix=jms.topic.;protocols=HORNETQ,STOMP;useEpoll=true</acceptor>

         <!-- MQTT Acceptor -->
         <acceptor name = "mqtt">tcp://0.0.0.0:1883?tcpSendBufferSize=1048576;tcpReceiveBufferSize=1048576;protocols=MQTT;useEpoll=true</acceptor>

      </acceptors>


      <security-settings>
         <security-setting match = "#">
            <permission type = "createNonDurableQueue" roles = "amq"/>
            <permission type = "deleteNonDurableQueue" roles = "amq"/>
            <permission type = "createDurableQueue" roles = "amq"/>
            <permission type = "deleteDurableQueue" roles = "amq"/>
            <permission type = "createAddress" roles = "amq"/>
            <permission type = "deleteAddress" roles = "amq"/>
            <permission type = "consume" roles = "amq"/>
            <permission type = "browse" roles = "amq"/>
            <permission type = "send" roles = "amq"/>
            <!-- we need this otherwise ./artemis data imp wouldn't work -->
            <permission type = "manage" roles = "amq"/>
         </security-setting>
      </security-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-settings>

    <addresses>

         <address name = "DLQ">
            <anycast>
               <queue name = "DLQ" />
            </anycast>
         </address>
         <address name = "ExpiryQueue">
            <anycast>
               <queue name = "ExpiryQueue" />
            </anycast>
         </address>
        <address name = "demoQueue">
          <anycast>
        <queue name = "demoQueue" />
         </anycast>        
       </address>
    </addresses>

   </core>
</configuration>

Можете ли вы вставить файл broker.xml из своего экземпляра Artemis?

Justin Bertram 17.12.2018 17:49

Спасибо, Джастин, я скопировал. Это почти значение по умолчанию, за исключением определения очереди.

Francesco Marchioni 18.12.2018 15:30

В случае, если это может кому-то когда-нибудь помочь: у меня была такая же ошибка при использовании сервера Artemis, встроенного в Wildfly. В моем случае проблема возникала постоянно, когда на сервере почти не хватало памяти и выполнялись очень длинные паузы сборщика мусора.

Guillaume 14.12.2020 09:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
3
3
1 913
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

  1. Если <address-full-policy> - это BLOCK и адрес достиг настроенного <max-size-bytes>.
  2. Если <address-full-policy> - это BLOCK и достигнуто значение <global-max-size> для всех адресов.
  3. Если достигнуто значение <max-disk-usage>.

Я предполагаю, что вы попали под №3. Поэтому я рекомендую вам увеличить свой max-disk-usage с 90 до 100, например:

<max-disk-usage>100</max-disk-usage>

Имейте в виду, что max-disk-usage - это не объем диска, который использовал сам брокер, а объем используемого диска Всего. Следовательно, если вы использовали 90% вашего диска (т.е. осталось только 10% свободного места), брокер заблокирует его.

Просто добавлю, что для новичка, такого как я, max-disk-usage - это не объем использования диска, который activemq каким-то образом "израсходовал", похоже, это просто максимальное использование диска, на котором работает activemq. В моем случае у меня было доступно менее 10% моего диска C, отсюда и эта ошибка.

JL_SO 04.07.2020 22:26

Спасибо @JL_SO, мой случай был таким же, менее 10% на моем диске. Кстати, вы можете получить докер для хранения данных с помощью команды docker info.

pazfernando 05.02.2021 21:56

Другие вопросы по теме