繁体   English   中英

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

[英]JBoss EAP 7.1: ActiveMQ configuration - MDB with properties JMS not consuming message

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

在我的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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM