使用Artemis,JBoss EAP 7.1和最终值队列

问题描述 投票:0回答:1

我们在JBoss EAP 7.1和Spring 4.3.10上使用JMS队列。

我们想将特定的队列设置为“ last-value-queue”,详细here

如果我们注释掉使用者配置,即队列没有附加使用者,则它将作为最后一个值队列,因此,具有相同_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>

我们在JBoss EAP 7.1和Spring 4.3.10上使用JMS队列。我们希望将特定的队列设置为“ last-value-queue”,如此处所述。如果我们注释掉使用者配置,即队列中没有...

java spring activemq-artemis jboss-eap-7
1个回答
1
投票

您正在看到预期的行为。如果连接了使用者,则默认情况下,由于消息缓冲,发送给代理的消息将立即分发给使用者。发送给消费者的消息被视为“正在传递”(即,它们已发送给客户端,但尚未被确认)。无法将“正在传递”的消息替换为“最后一个值”,因为此时它们实际上已超出经纪人的控制范围。

© www.soinside.com 2019 - 2024. All rights reserved.