У меня проблема с веб-приложением Spring, работающим на JBoss 7 JMS Cluster.
Я настроил кластер JMS с помощью этого статья — кластер использует общий журнал. Я использую конфигурацию live1 и backup1 из пример. Например, переключение между рабочим и резервным сервером с приложением, которое содержит Message Driven Bean, работает.
Я создал простое веб-приложение Spring, которое регистрирует прослушиватель JMS.
Мой jms-config.xml находится здесь:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="ConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="ConnectionFactory" />
</bean>
<bean id="testQueue" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/queue/test" />
</bean>
<bean id="listener" class="eu.cuptech.jms.ExampleListener" />
<bean id="listenerContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
<property name="connectionFactory" ref="ConnectionFactory" />
<property name="destination" ref="testQueue" />
<property name="messageListener" ref="listener" />
</bean>
</beans>
ПримерListener.java выглядит так:
package eu.cuptech.jms;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
public class ExampleListener implements MessageListener {
public void onMessage(Message message) {
try {
String msg = ((TextMessage) message).getText();
System.out.println("MESSAGE TEXT: " + msg);
} catch (JMSException e) {
throw new RuntimeException(e);
}
}
}
Когда я запускаю живой сервер, сообщения обрабатываются ExampleListener - все в порядке. Когда я запускаю сервер резервного копирования, я получаю сообщение об ошибке javax.naming.NameNotFoundException, потому что ConnectionFactory
не отображается в JNDI для сервера резервного копирования - тогда работает только основной сервер, а не кластер. Когда живой сервер выходит из строя, здесь нет резервной копии.
Когда я пытаюсь установить lazy-init="true"
и loadOnStartup="false"
(+ прокси-интерфейс) для ConnectionFactory и testQueue, ничего не меняется, потому что listenerContainer создаст его при запуске сервера резервного копирования. Мне нужно, чтобы listenerContainer подождал, пока сервер резервного копирования не заработает, а затем подключится к очереди.
Я также пробовал jms/RemoteConnectionFactory
, но с тем же результатом - ресурс под именем JNDI недоступен на резервном сервере.
Вот исходный код веб-приложения, создайте его с помощью maven mvn package
(проект «Затмение»). Вот простой JMS исходный код клиента (проект Eclipse).