У меня есть приложение 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 использует 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>