当前位置: 首页 > 知识库问答 >
问题:

使用Artemis、JBoss EAP 7.1和last值队列

任繁
2023-03-14

我们在JBoss EAP7.1和Spring4.3.10上使用JMS队列。

我们希望将一个特定队列设置为“last-value-queue”,如下所示。

如果我们注释掉消费者配置(即队列没有附加消费者),它将作为last-value-queue工作,因此具有相同_amq_lvq_name值的传入消息将取代先前存在的消息,并且消息不会累积。

如果我们保留使用者配置并使用thread.sleep()来模拟长时间运行的进程,以便不立即使用第一个消息以外的消息,那么具有相同_amq_lvq_name值的消息不会被丢弃,而是累积到队列中。

你有什么线索吗?

standalone.xml中的JBoss配置:

<?xml version="1.0" encoding="UTF-8"?>
<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
   <server name="default">
    ...
      <security-setting name="#">
         <role name="guest" send="true" consume="true" create-non-durable-queue="true" delete-non-durable-queue="true" />
      </security-setting>
      ...
      <address-setting name="jms.queue.NgedeRequestQueue" last-value-queue="true" address-full-policy="BLOCK" />
      <address-setting name="#" dead-letter-address="jms.queue.DLQ" expiry-address="jms.queue.ExpiryQueue" max-size-bytes="10485760" page-size-bytes="2097152" message-counter-history-day-limit="10" redistribution-delay="1000" />
      <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue" />
      <jms-queue name="DLQ" entries="java:/jms/queue/DLQ" />
      <jms-queue name="NgedeRequestQueue" entries="java:/jms/queue/NgedeRequestQueue" durable="true" />
      ...
      <connection-factory name="InVmConnectionFactory" entries="java:/ConnectionFactory" connectors="in-vm" />
      <connection-factory name="RemoteConnectionFactory" entries="java:jboss/exported/jms/RemoteConnectionFactory" connectors="http-connector" ha="true" block-on-acknowledge="true" reconnect-attempts="-1" />
      <connection-factory name="NgedeConnectionFactory" entries="java:jboss/exported/jms/NgedeConnectionFactory" connectors="http-connector" />
      <pooled-connection-factory name="activemq-ra" entries="java:/JmsXA java:jboss/DefaultJMSConnectionFactory" connectors="in-vm" transaction="xa" />
   </server>
</subsystem>

我们的Spring消费者配置:

<!-- Listener Definition -->
<bean id="messageListenerRequest" class="it.eng.ngede.jms.consumer.NationalApplicationRequestConsumer"/>

<bean id="NgedeRequestQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/jms/queue/NgedeRequestQueue" />
    <property name="jndiTemplate" ref="jnditemplate" />
</bean>

<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:/ConnectionFactory" />
    <property name="jndiTemplate" ref="jnditemplate" />
</bean>

<bean id="jnditemplate" class="org.springframework.jndi.JndiTemplate">
    <property name="environment">
        <props>
            <prop key="java.naming.factory.initial">org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory</prop>
        </props>
    </property>
</bean>

<!-- JmsContainer Definition -->
<bean id="jmsContainerRequest" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
    <property name="connectionFactory" ref="connectionFactory" />
    <property name="destination" ref="NgedeRequestQueue" />
    <property name="messageListener" ref="messageListenerRequest" />
    <property name="concurrentConsumers" value="1" />
</bean>

共有1个答案

夏才
2023-03-14

你看到了预期的行为。如果连接了使用者,则默认情况下,由于消息缓冲,发送到代理的消息将立即发送给使用者。发送给消费者的消息被认为是“在传递中”(即,它们已经发送给客户机,但还没有得到确认)。“正在传递”的消息不能被“最后一个值”替换,因为在这一点上,它们基本上不受代理的控制。

如果您想要不同的行为,那么我建议您在连接URL上设置consumerWindowsize=0,这样使用者就不会缓冲消息。当然,这可能会降低消息吞吐量,但这对您的用例来说可能并不重要。

 类似资料:
  • 我有一个Artemis代理(2.10.1)在一个Docker容器中运行,只有一个地址,但有许多(500)个队列。每个队列都有一个过滤器属性,它们不重叠,路由类型是多播的。 当客户端连接时,客户端和代理的cpu使用率从~5%上升到~40%,根据htop(~20%正常~20%内核)。JMX报告约10%的CPU使用率。将htop更改为树状视图时,我可以看到~10%的线程和许多0。x%的线程。队列是空的,

  • 我已经使用选项在Apache ActiveMQ Artemis中创建了地址和队列。但是,当我检查我的时,我没有找到我使用创建的任何地址和队列,尽管当我启动broker时,我可以在Artemis控制台上看到所有这些地址和队列。现在,我想将相同的配置复制到另一个服务器上,因为有大量的队列,所以很难在另一个服务器上创建所有的队列。是否有任何选项可以转储到并且我可以在另一台服务器上使用它,或者任何其他选项

  • 我在WildFly 18服务器上部署了EJB。我想将消息发送到部署在远程WildFly 18服务器上的队列(通过ActiveMQ Artemis)。使用注入和JCA以及是否可能实现这一点? 连接工厂和队列在远程Wildfly中配置如下: 在远程服务器上,队列配置如下: 更新 下面是我的EJB试图向远程Artermis(远程wildfly内部)发送消息: 当我试图部署包含此EJB的war时,我得到一

  • 我认为最初的作者认为这将创建一个持久的队列,但显然不是。我找不到这方面的好文档,想知道是否有人能证实/否认这一点。 提前谢了。

  • 你知道这里发生了什么吗?可以恢复消息和队列吗?如何使用ActiveMQ Artemis数据?所有队列/消息都丢失了。只有dlq/expiryqueue。 我们必须更改配置。所以我们开始更新从机。 为了将故障转移到从服务器以修复主服务器,我们执行了@16:32 在Master上有一些警告,但不多。 在从服务器上,我们可以看到一些超时和连接失败。不确定Slave是否接管了队列并且工作正常。 @16:4