タイガー!タイガー!じれったいぞー!(SE編)

AS400, Java, JavaEE, JSF等の開発、習慣など。日々の気づきをまとめたブログ(備忘録)

【MQ】 JavaでローカルキューにGutしてみる

間隔が空きましたが、MQの話です。

前回、ローカルキューにPutしてみました。

tigertaizo.hatenablog.com

今回は、数回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つのキューマネージャを準備し、「リクエスト/リプライ・メッセージ型」の環境を構築したいと思います。