JBoss EAP 7.1:ActiveMQ 配置 - 具有属性的 MDB JMS 不使用消息
JBoss EAP 7.1: ActiveMQ configuration - MDB with properties JMS not consuming message
我使用 JBoss EAP 7.1 (Wildfly) 并且在通过 standalone-full.xml
配置 queue 时遇到问题(ActiveMQ)
在我的 Web 应用程序中,有许多带有 属性 选择器的 MDB:属性 在 JMS 消息的 header 中设置。
如果消息没有设置正确的 属性(或没有 属性),它会在 queue 上保持阻塞状态,并且不会进入任何 DLQ 或过期 Queue。为什么是这样?为什么它没有被消耗?我已经使用自定义 DLQ 设置了 standalone-full.xml
,一个用于与其自己的 MDB 关联的任何 queue。可以强制此消息进入任何其他 queue?
这是来自 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。
我使用 JBoss EAP 7.1 (Wildfly) 并且在通过 standalone-full.xml
配置 queue 时遇到问题(ActiveMQ)
在我的 Web 应用程序中,有许多带有 属性 选择器的 MDB:属性 在 JMS 消息的 header 中设置。
如果消息没有设置正确的 属性(或没有 属性),它会在 queue 上保持阻塞状态,并且不会进入任何 DLQ 或过期 Queue。为什么是这样?为什么它没有被消耗?我已经使用自定义 DLQ 设置了 standalone-full.xml
,一个用于与其自己的 MDB 关联的任何 queue。可以强制此消息进入任何其他 queue?
这是来自 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。