0

JBoss 7 JMS クラスターで実行されている Spring webapp に問題があります。

この記事で JMS クラスターをセットアップしました- クラスターは共有ジャーナルを使用しています。exampleの live1 および backup1 構成を使用しています。メッセージ駆動型 Bean を含むアプリを使用したライブ サーバーとバックアップ サーバーの切り替えの例では、機能しています。

JMS リスナーを登録する簡単な Spring Web アプリを作成しました。

私の 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>

ExampleListener.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.NameNotFoundExceptionConnectionFactoryが発生しました。これは、バックアップ サーバーの JNDI で公開されていないためです。メイン サーバーのみが動作しており、クラスターではありません。ライブサーバーに障害が発生した場合、ここにはバックアップがありません。

ConnectionFactory と testQueue に (+ プロキシ インターフェイス) を設定しようとしても、バックアップ サーバーの起動時に listenerContainer によって作成されるため、何も変わりませlazy-init="true"ん。loadOnStartup="false"バックアップサーバーがライブになるまで待機し、キューに接続するlistenerContainerが必要です。

私も試しjms/RemoteConnectionFactoryましたが、同じ結果になりました.JNDI名の下のリソースはバックアップサーバーでは利用できません。

これは、 maven (Eclipse プロジェクト)を使用してビルドされたwebapp ソース コードです。mvn package簡単な JMSクライアントのソース コード(Eclipse プロジェクト) を次に示します。

4

1 に答える 1