JBOSS5.1 HA-JMSクラスタのJMSサービス


クラスタのJMSサービスJBoss AS 3.2.4以降のバージョンは、高可用性のallサーバ構成内のJMS(HA-JMS)サービスをサポートします.JBoss ASの現在のリリースでは、HA-JMSサービスはクラスタのsingleton fail-overサービスで実現されています.HA-JMSを自分で構成したい場合は、以前のJBoss ASバージョンで実行することができます.JBoss AS 3.0.7でHA-JMSを使用することに成功したお客様がいます.もっと質問があれば、JBossサポートに連絡してください.高可用性のSingleton Fail-over JBoss HA-JMSサービス(つまりメッセージキューとトピック)は、クラスタ内の単一ノード(プライマリノード)のみで所定の時間だけ実行されます.このノードがクラッシュした場合、クラスタシステムは簡単に別のノードを選択してJMSサービス(fail-over)を実行します.この設定は、サーバのダウンタイムに対するじょうちょうの対策を提供するが、JMSサーバノードの負荷を低減することはできない.注意HA-JMSキューに対してふかへいこう(このキューを実行するプライマリノードは1つしかない)を行うことはできませんが、キュー内の情報を処理するMDBsの負荷をバランスさせることができます(章6.1.3、「ふかへいこうのHA-JMS MDBs」参照).サーバ側構成singleton fail-over HA-JMSサービスを使用するには、クラスタ内のすべてのノードで同じJMSサービスを構成する必要があります.これには、JMSに関連するすべてのMBeansおよび導入されたJMSアプリケーションが含まれます.JMSサーバは、DefaultDS内の永続化のデータに設定されている.デフォルトでは、含まれるHSQLDBです.しかし、ほとんどのクラスタ環境では、すべてのノードがデータ持続性を共有データベースに接続する必要があります.したがって、クラスタJMSを起動する前に最初に行うことは、共有データベースを構築することです.•選択したデータベース・サーバを指すためにDefaultDSを構成する必要があります.docs/examples/jcaディレクトリの下のxxx-dsです.xmlファイルはdeploy/hsqlsb-dsに代わる.xmlファイル.xxxはターゲット共有データベースの名前(mysql-ds.xmlなど)です.•server/all/deploy-hasingleton/jmsディレクトリのhsqldb-jdbc 2-service.xmlファイルは特定のデータベースのファイルで置き換えられます.例えば、MySQLのファイルはmysql-jdbc 2-serviceです.xml.JBoss ASリリースでは、RDBMSのプロファイルがいくつかバンドルされています.docs/examples/jmsで見つけることができます.server/all/deploy-hasingleton/jmsディレクトリのhsqldb-jdbc-state-serviceを置き換える必要はありません.xmlファイル.名前にはhsqlが含まれていますが、HSQL、MySQL、SQLサーバ、およびその他のデータベースを含むすべてのSQL 92対応データベースに適用されます.私たちが上記のように、DefaultDSを自動的に使用してデータを保存します. 
HA-JMSクライアントクライアントクライアントと従来のJMSクライアントは2つの点で異なる.•The HA-JMSのお客様は、HA-JNDIのJMS connection factories(デフォルトポートは1100)を取得する必要があります.•お客様の接続は、サーバ異常(exceptions)を監視する必要があります.クラスタシステムfail-overが別のプライマリノードに接続されると、現在の接続上のすべてのクライアント操作が失敗し、例外が発生します.クライアントは再接続を知っている必要があります.注意HA-JMS接続ファクトリ(connection factory)は、JMSサービスを実行する現在のプライマリノードを知っていますが、インテリジェントなクライアントインターセプタ(client side interceptor)は存在しません.クライアントstubは、サーバトポロジーの変化に応じて調整できない固定されたプライマリノードのみを知っている.
ロード・バランシングされたHA-JMS MDBsは、HA-JMSキュー(queues)とトピック(topics)が同じ時間に単一ノード上でのみ実行されるが、他のノード上のMDBsもHA-JMSマスターノード上の情報を受信および処理することができる.この競合はMDBsの平衡負荷挙動をもたらす.MDBsのバランシング負荷を有効にするには、キューのreceiverを指定します.このreceiverは、どのノードが情報と情報をどのような順序で処理するかを記録する.JBossは3つのreceiverの実装(implementations)を提供します.•The org.jboss.mq.server.ReceiversImplは、HashSetのデフォルトインプリメンテーションです.•The org.jboss.mq.server.ReceiversImplArrayListはArrayListの実装です.•The org.jboss.mq.server.ReceiversImplLinkedListはLinkedListの実装である.receiverインプリメンテーションのクラス名は、各ノードで永続的なJMS QueueまたはDestinationManagerを定義するMBeanのプロパティとして指定できます.最適な負荷バランシング性能を得るためには、JVMのHashSetの実装があまりよくないため、ReceiverImplArrayListまたはReceiverImplArrayListを使用して実装することをお勧めします.
 
 
JBOSS 5.1の構成
JMSのConnectionFactoryとQueue,Topicをそれぞれ2台の機器に配置する.
ディレクトリの場所:%JBOSS_HOME%/server/%INSTANCE%/deploy/構成メッセージの永続化に必要なデータベース:hsqldb-ds.xmlディレクトリの場所:%JBOSS_HOME%/server/%INSTANCE%/deploy/messaging
そのうち:connection-factories-service.xmlは、JMSのConnectionFactoryを構成するサービスのプロファイルです.ここでConnectionFactoryは通常のConnectionFactoryであり、自動failoverメカニズムと負荷等化はサポートされず、一般的なアプリケーションプロジェクトでConnectionFactoryに使用される.ClusteredConnectionFactoryがJBOSSに提供するクラスタConnectionFactoryは自動failoverメカニズムと負荷等化の作成をサポートします.ただし、メッセージドライバbeanではサポートされていません(MDB)が、failoverと負荷分散メカニズムを起動するには、truetrueClusterPullConnectionFactoryがJBOSSに提供する非ConnectionFactoryのJNDIバインドを設定する必要があります.クラスタ内のConnectionFactoryメッセージの作成にのみ使用します.1つのノードから他のノードに転送します.MyExampleConnectionFactoryは、JBOSSが提供するConnectionFactoryの作成にすべてのプロパティのインスタンスを使用し、ユーザーが参照できるようにします.
 
hsqldb-persistence-service.xmlは、通常の構成JMSのメッセージ永続化プロファイルです.ここでこのようにデータベース(db 2,hsqldb,mysql,oracle,postgresqlなど)に永続化するには、%JBOSS_を参照してください.HOME%docsexamplesjms関連プロファイル
clustered-hsqldb-persistence-service.xmlは、JMSクラスタを構成する場合のメッセージ永続化プロファイル(本人が直接使用している%JBOSS_HOME%docsexamplesjms以下のcopy)ですが、hsqldbをメッセージ永続化データベースとして使用することは公式には推奨されていません.トランザクションサポートがあまりよくない可能性があります.
destinations-service.xmlは、JMSのQueue/Topicを構成するサービスのプロファイルです.ここで、DLQ、ExpiryQueue messaging-serviceのような2つのデフォルトのキューを構成します.xmlはJBOSSメッセージサービスのディスクリプタファイルを配置し、デフォルトのメッセージキューメッセージを構成する必要があります.
クライアント構成:JBOSS 5.1 HA-JMSの使用中に要求されるサーバパスの構成は以下の通りである:Properties prop=new Properties();        prop.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");        prop.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");        prop.setProperty("java.naming.provider.url", "192.168.70.104:1099,192.168.45.146:1099");
 
 
HA-JMSクライアントコードは以下の通りである.
import java.util.Properties;

import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.TextMessage;
import javax.naming.Context;

/**
<p> 
</p>
 *  
 * <p>    ,            。<p>
 *
 *      2013-5-28<br>
 * @author  longgangbai<br>
 * @version $Revision$ $Date$
 * @since   3.0.0
 */
public class CLusterClient {

    /**
     * @param args
     */
    public static void main(String[] args) {
        try {
            //  JNDI     
            Context context = getInitialContext();
            //          
            QueueConnectionFactory obj = (QueueConnectionFactory) context.lookup("ClusteredConnectionFactory");
          //        
            QueueConnection conn = obj.createQueueConnection();
            //         
            QueueSession session = conn.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
            //    
            Queue queue = (Queue) context.lookup("queue/DLQ");
            //
            String text = "hello world";
            //        message
            QueueSender sender = session.createSender(queue);
            for (int i = 0; i < 100; i++) {
                TextMessage tm = session.createTextMessage(text);
                System.out.println("send text:" + text);
                sender.send(tm);
            }
            //      
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("-------------OK");
    }

    public static Context getInitialContext() throws Exception {
        try {
            Properties prop = new Properties();
            prop.setProperty("java.naming.factory.initial", "org.jnp.interfaces.NamingContextFactory");
            prop.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming:org.jnp.interfaces");
            prop.setProperty("java.naming.provider.url", "192.168.70.104:1100,192.168.45.146:1100");
            return new javax.naming.InitialContext(prop);
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }
}