首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JBoss EAP 7.1: ActiveMQ配置--具有属性的MDB不消耗消息

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

Stack Overflow用户
提问于 2019-06-05 12:28:15
回答 1查看 1.2K关注 0票数 1

我使用JBoss EAP 7.1 (野生蝇),并在通过standalone-full.xml (ActiveMQ)配置队列时遇到问题。

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

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

代码语言:javascript
复制
<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>

JavaEJB3.0 MDB注释:

代码语言:javascript
复制
@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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-05 15:11:41

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

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

代码语言:javascript
复制
<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。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56460505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档