間隔が空きましたが、MQの話です。
前回、ローカルキューにPutしてみました。
今回は、数回Putした後で、そのローカルキューからGetして、取得したメッセージを表示するサンプリアプリを作ってみました。
サンプルコード
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.CMQC; public class testGetMQ { // MQサーバーの接続情報 private static final String HOST = "192.168.1.1"; private static final int PORT = 1414; private static final int CCSID = 932; private static final String CHANNEL = "TSQMGR_CLNT"; private static final String QMGR = "TSQMGR"; private static final String QUEUE_NAME = "QL.A"; private static final String USER = "t_yamada"; private static final String PASSWORD = "password"; public static void main(String[] args) { try { MQEnvironment.hostname = HOST; MQEnvironment.port = PORT; MQEnvironment.CCSID = CCSID; MQEnvironment.channel = CHANNEL; MQEnvironment.userID = USER; MQEnvironment.password = PASSWORD; MQQueueManager qmgr = new MQQueueManager(QMGR); // キューをOPENして、キュー定義のデフォルトを使用してメッセージを取得 | MQOPEN呼出しは、QMGRが静止状態になっている場合は失敗する int openOptions = CMQC.MQOO_INPUT_AS_Q_DEF | CMQC.MQOO_FAIL_IF_QUIESCING; MQQueue queue = qmgr.accessQueue(QUEUE_NAME, openOptions); // キューがなくなるまでメッセージを取得 while (true) { MQMessage message = new MQMessage(); MQGetMessageOptions gmo = new MQGetMessageOptions(); // 適切なメッセージが到着するまで待機 | MQOPEN呼出しは、QMGRが静止状態になっている場合は失敗する gmo.options = CMQC.MQGMO_WAIT | CMQC.MQGMO_FAIL_IF_QUIESCING; // アプリケーションが待機する最大時間(ミリ秒) gmo.waitInterval = 5000; try { queue.get(message, gmo); System.out.println("Received message: " + message.readLine()); } catch (MQException mqe) { if (mqe.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) { // キューが空の場合 System.out.println("Queue is empty. Exiting..."); break; } else { throw mqe; } } } queue.close(); qmgr.disconnect(); } catch (MQException ex) { if (ex.reasonCode == CMQC.MQRC_NO_MSG_AVAILABLE) { System.out.println("No messages available in the queue."); } else { ex.printStackTrace(); } } catch (Exception ex) { System.err.println("Exception: " + ex.getMessage()); ex.printStackTrace(); } } }
実行結果
下記は、2件のメッセージがローカルキューに溜まっている状態で、上記サンプルコードを実行した結果です。
Received message: Hello, MQ さん!: 2024/04/12 18:24:57.171 Received message: Hello, MQ さん!: 2024/04/12 18:25:00.201 Queue is empty. Exiting...
サンプルでは、ローカルキューにあるメッセージを繰り返し取得します。
結果より、2件のメッセージを取得できています。
インターバル(サンプルでは5秒)の時間が経過したことで、「Queue is empty. Exiting...」をメッセージを書き出し、ループを抜けました。
次回は、2つのキューマネージャを準備し、「リクエスト/リプライ・メッセージ型」の環境を構築したいと思います。