【问题标题】:Error in Spring Boot JMS Producer: AMQ212054 Destination address is blockedSpring Boot JMS Producer 中的错误:AMQ212054 目标地址被阻塞
【发布时间】:2019-05-17 22:55:14
【问题描述】:

我正在尝试使用 Spring Boot 2.1.1.RELEASE 连接到远程 Artemis 2.6.3 发送器。到目前为止,在我发现的所有示例中,发件人在尝试发送消息时都会挂起(例如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 中队列尚未配置为 BLOCK。 spring-boot-starter-artemis/Artemis 有什么bug吗?

更新:我的 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>

【问题讨论】:

  • 你能从你的 Artemis 实例中粘贴 broker.xml 吗?
  • 谢谢贾斯汀,我已经复制了。它几乎是默认的,除了 Queue 定义
  • 如果某天可能对某人有所帮助:我在使用 Wildfly 中嵌入的 Artemis 服务器时遇到了同样的错误。在我的情况下,当服务器几乎耗尽内存并且正在执行很长时间的垃圾收集器暂停时,问题会间歇性发生。

标签: spring-boot activemq-artemis


【解决方案1】:

代理可能会阻止将消息发送到某个地址的原因有多种:

  1. 如果&lt;address-full-policy&gt;BLOCK且地址已达到配置的&lt;max-size-bytes&gt;
  2. 如果&lt;address-full-policy&gt;BLOCK 并且所有地址的&lt;global-max-size&gt; 都已到达。
  3. 如果到达&lt;max-disk-usage&gt;

我的猜测是你达到了#3。因此,我建议您将max-disk-usage90 增加到100,例如:

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

请记住,max-disk-usage 不是代理本身已使用的磁盘量,而是 total 已使用的磁盘量。因此,如果您使用了 90% 的磁盘(即只剩下 10% 的可用空间),那么代理将阻塞。

【讨论】:

  • 只是补充一下,对于像我这样的新手来说,max-disk-usage 并不是 activemq 以某种方式“用完”的磁盘使用量,它似乎只是最大磁盘使用量activemq 正在运行的磁盘。在我的情况下,我的 C 驱动器可用不到 10%,因此出现此错误。
  • 谢谢@JL_SO 我的情况是一样的,在我的磁盘中不到 10%。顺便说一句,您可以使用命令 docker info 获取存储数据 docker 的位置。
猜你喜欢
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 2017-09-09
  • 2010-09-10
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多