MQ Exporler IBM MQクラスタを構成し、テストクラスタキューの負荷分散を実現

5942 ワード

一.クラスタの構成
ここでは、MQ Exporlerでクラスタを構成する方法について説明します.
1.QM 1、QM 2、QM 3の3つのキューマネージャを新規作成します(この3つのキューマネージャは、異なるホスト、異なる環境で使用できます).
2.MQ Exporlerに3つのキューマネージャを追加し、接続がスムーズであることを確認
3.「キューマネージャクラスタ」でクラスタを新規作成し、「CLUSTER_TEST」と名付け、デフォルトでは2つのキューマネージャを選択してフル・リポジトリにアクセスし、QM 1、QM 2を選択します.
4.フル・リポジトリにアクセスするキュー・マネージャを選択すると、「クラスタ受信者チャネル名」および「クラスタ受信者チャネル接続名」が1つずつ入力されます.ここで、「クラスタ受信チャネル名」は、TOのような自分の受信チャネルを指す.QM 1、この名前の一意性を確認してください.QM 1が他のクラスタに存在し、チャネル名がTOである場合.QM 1では,クラスタ内ではTOを再利用できない.QM 1です.「クラスタ受信者チャネル接続名」は、QM 1が存在するホストを指し、フォーマット要件があり、この名前は勝手に命名することはできません.IP(PORT)フォーマットでなければなりません.例えば、私のQM 1がリモートマシンにある場合、この名前は192.168.178.129(1415)のようになります.
この2つのチャネルの構成が完了するとクラスタの構成が完了する、クリックが完了するとそれぞれQM 1,QM 2に2つのチャネルが確立され、1つは送信側チャネル、1つは受信側チャネルであり、この2つのチャネルは互いに対応する、すなわちQM 1上の送信側チャネルTOである.QM 2は、QM 2上の受信チャネルTOに対応する.QM2;QM 1上の受信チャネルTO.QM 1は、QM 2上の送信元チャネルTOに対応する.QM1
5.QM 1、QM 2のそれぞれのチャネルに入り、以上の構成の送信側チャネルを起動すると、対応する受信側チャネルが自動的に起動し、起動後のチャネルの状態がすべて「実行中」であれば、クラスタが成功したことを示す.
6.引き続きクラスタにキューマネージャを追加する必要がある場合は、クラスタ名を右クリックし、「キューマネージャをクラスタに追加」を選択します.ここでQM 3をクラスタに追加します.
注意次の手順で「フル・リポジトリ」または「部分リポジトリ」を選択します.ここでは部分を選択すればいいので、詳細はリポジトリの説明を参照してください.
二.クラスタキューのテスト
≪クラスタ・キュー|Cluster Queue|emdw≫:ホスト・キュー・マネージャは、クラスタ内で共有され、メッセージを送信および受信できるキューのローカル定義を有します.クラスタ内の他のメンバーもこのキューを表示できますが、メッセージを送信するだけで、データを受信できません.
1.QM 2、QM 3それぞれに同名のローカルキューRECEIVERを確立する.INは、クラスタCLUSTER_に設定されます.TESTで共有することで、クラスタ内のいずれかのキューマネージャでこの2つのキューが表示されます.
いずれのキューマネージャ対も、この2つのキューマネージャにメッセージを入れることができる、特にQM 1でこのRECEIVERに向かう場合には、メッセージを入れることができる.INがメッセージを入れることで、負荷等化を実現することもできる、例えば5つのメッセージが入ると、MQは自動的にこの5つのメッセージをそれぞれQM 2,QM 3のRECEIVERに入れる戦略をとる.INでは,1つは2つ,もう1つは3つを得る.使用できるプログラムテスト
行列へINメッセージを入れる:
package com.watson.mq;

import java.io.IOException;

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.MQConstants;

public class MQSender {
	public static void main(String[] args) {
		System.out.println("Starting Sender");
		MQQueueManager queueManager = null;
		MQQueue q = null;

		try {
			// connect to default queue manager specified as first program
			// argument from the command line
			
                         /*
                          * MQEnvironment  MQ       , MQQueueManager                  ,
                          *  MQQueueManager                   。
                                        ,     MQEnvironment  ,                   ,      
                        */
			/*MQEnvironment.hostname = "192.168.178.129";
			MQEnvironment.port = 2414;
			MQEnvironment.channel = "CH_QM1";*/
			
			queueManager = new MQQueueManager("IB9QMGR");
			// Connect to the receiver's cluster queue
			// This queue dosn't need to be defined
			// as a remote queue on the local queue manager
			// Rather, it is defined in the cluster repository
			// therefore this queue manager knows about it
			q = queueManager.accessQueue("RECEIVER.IN", MQConstants.MQOO_OUTPUT
					+ MQConstants.MQOO_BIND_NOT_FIXED);
			for (int i = 1; i <= 5; i++) {
				MQMessage message = new MQMessage();
				message.writeString("Test message " + i);
				q.put(message);
				System.out.println("Put test message " + i);
			}
			q.close();
			queueManager.disconnect();
		} catch (MQException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable t) {
			t.printStackTrace();
		} finally {
			try {
				if (q != null && q.isOpen()) {
					q.close();
				}
				if (queueManager != null && queueManager.isConnected()) {
					queueManager.disconnect();
				}
			} catch (MQException ex) {
				ex.printStackTrace();
			}
		}
	}
}

それぞれQM 2,QM 3からメッセージを取り出す:
package com.watson.mq;

import java.io.IOException;

import com.ibm.mq.MQEnvironment;
import com.ibm.mq.MQException;
import com.ibm.mq.MQGetMessageOptions;
import com.ibm.mq.MQMessage;
import com.ibm.mq.MQQueue;
import com.ibm.mq.MQQueueManager;
import com.ibm.mq.constants.MQConstants;

public class MQReceiver {
	public static void main(String[] args) {
		System.out.println("Starting Receiver");
		try {
			// connect to default queue manager specified
			// as first program argument from the command line
			// MQConnectionManager mcm = new MQConnectionManager();
			/*
			 * MQEnvironment  MQ       , MQQueueManager                  ,
			 *  MQQueueManager                   。
                                        ,     MQEnvironment  ,                   ,      
                        */
			MQEnvironment.hostname = "192.168.178.129";
			MQEnvironment.port = 2414;
			MQEnvironment.channel = "CH_QM1";
			MQQueueManager queueManager = new MQQueueManager("QM1");
			MQQueue q = queueManager.accessQueue("RECEIVER.IN",
					MQConstants.MQOO_INPUT_SHARED);
			MQGetMessageOptions mqGMO = new MQGetMessageOptions();
			// wait 10 seconds for a message to appear
			mqGMO.waitInterval = 10000;
			while (true) {
				MQMessage message = new MQMessage();
				try {
					q.get(message, mqGMO);
					System.out.println("Received message: "
							+ message.readStringOfByteLength(message
									.getDataLength()));
				} catch (MQException ex) {
					// for any other error than
					// "no message available on queue", just exit
					if (ex.reasonCode == MQConstants.MQRC_NO_MSG_AVAILABLE) {
						break;
					}
				}
			}
			if (q != null && q.isOpen()) {
				q.close();
			}
			if (queueManager != null && queueManager.isConnected()) {
				queueManager.disconnect();
			}
		} catch (MQException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}
}