Сообщение JMS не получено слушателем Spring

1

У меня есть приложение Spring, работающее внутри автономного JBoss EAP 6.2 (с его встроенным поставщиком HornetQ).

Сообщения успешно помещаются в очередь (я вижу их в jboss-eap-6.2\standalone\data\messagingjournal\hornetq-data-1.hq, потому что очередь прочная), но не подхвачена слушателем (точка останова внутри слушатель не попал). Я подозреваю, что что-то отсутствует в конфигурации или неправильно, но не может понять, что. JBoss запускается без ошибок проверки.

Во-первых, выдержка из Spring applicationContext.xml:

Имена JNDI фабрики подключений и очереди совпадают с именами JVSS в standalone-full.xml

<jee:jndi-lookup id="jmsConnectionFactory" jndi-name="java:/JmsXA" resource-ref="false" proxy-interface="javax.jms.ConnectionFactory"/> 

<jee:jndi-lookup id="myQueue" jndi-name="java:jboss/exported/jms/queue/myQueue"/> 

<bean id="myHandler" class="com.example.MyHandler" />

<jms:listener-container destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="java:jboss/exported/jms/queue/myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>

Обработчик сообщения объявлен как компонент Spring, а имена классов и методов соответствуют тому, что было объявлено выше:

@Component
public class MyHandler {

public void processMessage(MyMessage delaySendTransfer) {
    //...
}
Теги:
spring
jms
jboss
hornetq

1 ответ

3
Лучший ответ

По умолчанию Spring использует DynamicDestinationResolver для контейнера-слушателя, поэтому он ожидает получить ссылку на компонент в атрибуте назначения слушателя. Поскольку вы используете имя JNDI, вы должны установить стратегию распознавателя назначения для jndiDestinationResolver.

<jms:listener-container destination-resolver="jndiDestinationResolver" destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="java:jboss/exported/jms/queue/myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>

Замена значения атрибута назначения ссылкой на bean также должна сделать трюк:

<jms:listener-container destination-type="queue" acknowledge="auto" connection-factory="jmsConnectionFactory">
    <jms:listener destination="myQueue" ref="myHandler" method="processMessage" />
</jms:listener-container>
  • 0
    Это работает сейчас, спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню