JBoss EAP 7.1:ActiveMQ 配置 - 具有属性 JMS 不消耗消息的 MDB



我使用 JBoss EAP 7.1 (Wildfly( 并且通过 standalone-full.xml (ActiveMQ( 配置队列时遇到问题

在我的 Web 应用程序中,有许多带有属性选择器的 MDB:在 JMS 消息的标头中设置的属性。如果邮件没有设置正确的属性(或没有属性(,则它在队列中保持阻塞状态,并且不会进入任何 DLQ 或到期队列。这是为什么呢?为什么它没有被消费?我已经使用自定义 DLQ 设置了standalone-full.xml,一个用于与其自己的 MDB 关联的任何队列。是否可以强制此消息进入任何其他队列?

以下是来自standalone-full.xml的相关 XML:

<subsystem xmlns="urn:jboss:domain:messaging-activemq:2.0">
   ...
   <address-setting name="#" page-size-bytes="2097152" max-size-bytes="10485760" expiry-address="jms.queue.ExpiryQueue" dead-letter-address="jms.queue.DLQ"/>
   <address-setting name="jms.queue.BackEndDelivery" dead-letter-address="jms.queue.BackEndDeliveryUndelivery" expiry-address="jms.queue.ExpiryQueue" redelivery-delay="10000" max-delivery-attempts="5"/>
   <address-setting name="jms.queue.FrontEndDelivery" dead-letter-address="jms.queue.FrontEndDeliveryUndelivery" expiry-address="jms.queue.ExpiryQueue" redelivery-delay="10000" max-delivery-attempts="5"/>
   ...
   <jms-queue name="ExpiryQueue" entries="java:/jms/queue/ExpiryQueue"/>
   <jms-queue name="DLQ" entries="java:/jms/queue/DLQ"/>
   <jms-queue name="BackEndDelivery" entries="java:jboss/exported/jms/queue/BackEndDelivery"/>
   <jms-queue name="FrontEndDelivery" entries="java:jboss/exported/jms/queue/FrontEndDelivery"/>
   <jms-queue name="BackEndDeliveryUndelivery" entries="java:jboss/exported/jms/queue/BackEndDeliveryUndelivery"/>
   <jms-queue name="FrontEndDeliveryUndelivery" entries="java:jboss/exported/jms/queue/FrontEndDeliveryUndelivery"/>
   ...
</subsystem>

Java EJB 3.0 MDB 注释:

@MessageDriven(activationConfig = {
        @ActivationConfigProperty(propertyName = "destination", propertyValue = "BackEndDelivery"),
        @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"),
        @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "Action='BackEndEntryPoint'") }, mappedName = "BackEndDelivery")
@TransactionManagement(TransactionManagementType.BEAN)

您看到的是预期的行为。如果存在与队列的任何使用者的选择器不匹配的消息,则不会使用该消息。仅当客户端尝试使用消息并失败 5 次(即您为 max-delivery-attempts 设置的值(时,它才会发送到 DLQ。只有当消息有过期时间(显然没有(时,它才会发送到 ExpiryQueue。

您可以通过设置expiry-delay地址设置来强制邮件具有过期时间,例如:

<address-setting name="jms.queue.BackEndDelivery" dead-letter-address="jms.queue.BackEndDeliveryUndelivery" expiry-address="jms.queue.ExpiryQueue" expiry-delay="5000" redelivery-delay="10000" max-delivery-attempts="5"/>
<address-setting name="jms.queue.FrontEndDelivery" dead-letter-address="jms.queue.FrontEndDeliveryUndelivery" expiry-address="jms.queue.ExpiryQueue" expiry-delay="5000" redelivery-delay="10000" max-delivery-attempts="5"/>

通过设置expiry-delay="5000"可以强制将 5 秒内未使用的任何消息发送到 ExpiryQueue。

最新更新