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メッセージを入れる:
それぞれQM 2,QM 3からメッセージを取り出す:
ここでは、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();
}
}
}