JBoss EAP 7.1: конфигурация ActiveMQ - MDB со свойствами JMS не использует сообщение - PullRequest
0 голосов
/ 05 июня 2019

Я работаю с JBoss EAP 7.1 (Wildfly) и имею проблемы с настройкой очереди через standalone-full.xml ( ActiveMQ )

В моем веб-приложении естьмногие MDB с селектором свойства: свойство установлено в заголовке сообщения JMS.Если сообщение не имеет правильного набора свойств (или не имеет свойства), оно остается заблокированным в очереди и не отправляется в очередь DLQ или Expiry.Почему это?Почему это не потребляется?Я установил standalone-full.xml с пользовательским DLQ, один для любой очереди, связанной с собственным MDB.Можно ли заставить это сообщение перейти в любую другую очередь?

Вот соответствующий XML из standalone-full.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 MDB EJB 3.0:

@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)

1 Ответ

1 голос
/ 05 июня 2019

То, что вы видите, - это ожидаемое поведение. Если есть сообщение, которое не соответствует селектору ни одного из потребителей очереди, сообщение не будет использовано. Оно будет отправлено в DLQ только в том случае, если клиент попытается получить сообщение и не получит 5 раз (т. Е. Значение, которое вы установили для max-delivery-attempts). Оно будет отправлено в 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.

...