Кластер JBoss AS7 JMS с приложением Spring

У меня проблема с веб-приложением 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).


person Boris Šuška    schedule 30.07.2013    source источник


Ответы (1)


Обратите внимание, что резервный сервер является пассивным сервером обмена сообщениями HornetQ и не может иметь производителей или потребителей до аварийного переключения.

Документы HornetQ (живые — резервные группы): http://docs.jboss.org/hornetq/2.3.0.Final/docs/user-manual/html_single/#d0e11266

person Heinz    schedule 30.07.2013
comment
У него нет перед отказоустойчивостью, потому что приложение никогда не запускается на сервере. Даже после сбоя живого сервера резервная копия должна стать активной. - person Boris Šuška; 31.07.2013