Freewareで習得するIBM MQの基本

接続モード(1)

※本連載は最新のmqpgf/mqpcfに基づいて改定されることがあります。常に最新バージョンをダウンロードしてご使用ください。


接続モードの概要

MQMDの各フィールドに関連した機能を実際に動かして確しかめてみることで、IBM MQについてのおおよそのイメージを持っていただけたと思います。 次に、アプリケーションがキューマネージャーへ接続する際の様々なモードについてご説明したいと思います。

接続のタイプは、バインド(バインディング)接続、クライアント接続(MQ Javaではバインディング・モード、クライアント・モードと呼びます)という用語を使用して大きく2つに分けて説明されること多いです。 ここでのバインド(バインディング)接続とは、簡単にはキューマネージャーが稼働しているマシンと同じマシン上のアプリケーションで使用する接続モードを指しています。 クライアント接続とは、キューマネージャーが稼働しているマシンの外部からTCP/IPなどを使用して接続するモードです。
C言語では、それぞれで、リンクするライブラリも異なり、サーバー・ライブラリ(libmqm, libmqm_r, libmqm64, libmqm64_rのいずれか)にリンクされたアプリケーションをサーバー・アプリケーション、クライアント・ライブラリ(libmqic, libmqic_r, libmqic64, libmqic64_rのいずれか)にリンクされたアプリケーションをクライアント・アプリケーションと呼びます。 それぞれのアプリケーションの作成/コンパイル方法は、製品のマニュアルを参照してください。 本連載でご紹介しているプログラムは、mqpgf、mqpcfがサーバーのライブラリ、mqpgfc、mqpcfcがクライアント・ライブラリとリンクされています。 アプリケーションが発行するMQI呼び出しはローカル・キューマネージャー・エージェント(LQMA)というプロセス/スレッドが処理を仲介して実行します。 バインド接続では、この時のアプリケーションとエージェントの間のインターフェースの分離レベルでさらに3つのモード、FAST、SHARED、ISOLATEDがあります。 分離レベルは、FAST、SHARED、ISOLATEDの順に高くなり、もっとも高いISOLATEDはアプリケーションの異常処理の影響をキューマネージャーがもっとも受けにくい接続モードです。 逆にもっとも分離レベルの低いFASTは、アプリケーションの異常の影響をダイレクトにキューマネージャーが受けてしまう危険がありますが、パフォーマンスは他のモードよりも有利です。 システムの要件に従って、適切な分離レベルを選択します。

このページの先頭へ

接続モードの種類

それでは、接続モードの種類とその概略をご説明します。 括弧内はMQCNO接続オプションで、MQCONNX()を使用する場合に指定可能です。 MQCONN()を使用する場合はこのオプションを直接指定できませんので、他の方法(後述)を使用します。


STANDARD BINDING(MQCNO_STANDARD_BINDING)

デフォルトのオプションです。 MQCONN()を使用している場合、または、MQCONNX()にMQCNO_STANDARD_BINDING(デフォルト)を指定している場合は、qm.iniのConnectionスタンザのDefaultBindType属性で指定されているモードで接続します。 DefaultBindTypeには、SHAREDまたはISOLATEDが指定可能です。

Connection:
DefaultBindType=SHARED|ISOLATED

設定されていない場合のデフォルトは、SHAREDです。
注)MQ8.0 for HP NonStopの場合は、MQCNO_GUARDIAN_BINDING という特殊な値になります。

MQCNO_GUARDIAN_BINDING 0x00020000

また、MQCONN()を使用している場合、または、MQCONNX()にMQCNO_STANDARD_BINDING(デフォルト)を指定している場合は、MQ_CONNECT_TYPE環境変数に下記のいずれかを設定することによって接続モードを変更することができます。

CLIENT: クライアント接続のみ試行
FASTPATH: 現在のバージョンでは指定されても無視(以前のリリースでサポートされていたもの)
LOCAL: サーバー接続のみ試行。ファスト・パス接続は、他のサーバー接続にダウングレードされる。
STANDARD: 現在のバージョンでは、LOCALと同じ処理。


FASTPATH BINDING(MQCNO_FASTPATH_BINDING)

このモードで接続するアプリケーションをトラステッド・アプリケーションと呼びます。 このモードでは、ローカル・キュー・マネージャー・エージェントはユーザー・アプリケーションと同じプロセスになります。 言い換えると、アプリケーションのプロセスは、別のキューマネージャーのプロセスであるローカル・キュー・マネージャー・エージェントを介さずに、ダイレクトにアプリケーションのプログラムからキュー等のMQのリソースへアクセスします。 パフォーマンスは最大限になる反面、危険度の高い接続モードです。 トラステッド・アプリケーションを使用する場合、いくつかの制限事項がありますので、製品マニュアルで事前に確認してください。


SHARED BINDING(MQCNO_SHARED_BINDING)

このモードはほとんどのプラットフォームのデフォルトです。 アプリケーションとエージェントとの通信には共有メモリなどが使用され、アプリケーションとエージェントプロセスがそのシステムのリソースのいくつかを共有します。 特に事情がない限りはこのモードを使用します。


ISOLATED BINDING(MQCNO_ISOLATED_BINDING)

このモードの場合、アプリケーションとローカル・キュー・マネージャー・エージェントはリソースを共有せず、分離されています。 アプリケーションとローカル・キュー・マネージャー・エージェントは、Unix系のプラットフォームでは、この分離されたバインディングの為にUNIXドメイン・ソケットを使用します。


LOCAL BINDING(MQCNO_LOCAL_BINDING)

サーバー接続(FASTPATH_BINDING、SHARED_BINDING、ISOLATED_BINDINGのいずれか)で接続されます。 これが指定された場合は、この3つのサーバー接続のいずれかのみです。 STANDARD BINDINGの場合の様に、接続モードをクライアント接続に変更することはできません。 同時にMQCNO_FASTPATH_BINDING、MQCNO_SHARED_BINDING、MQCNO_ISOLATED_BINDINGのいずれも設定されていない場合は、デフォルトの接続モードが選択されます。


CLIENT BINDING(MQCNO_CLIENT_BINDING)

クライアント接続を試行します。 先に、C言語ではバインド(バインディング)接続、クライアント接続とで、別のライブラリにリンクすることをご説明しましたが、サーバー・ライブラリにリンクされたアプリケーションでもクライアント接続を試行するようにできます。 ちなみに、逆を実行しようとすると 2568 MQRC_CONNECTION_NOT_AVAILABLEで失敗します。

>mqpgfc -qm SampleQM -q SampleQ MQCNO_LOCAL_BINDING
MQCONNX fail : SampleQM CompCd=02 ReasonCd=2568
!!! Queue Manager Connect Fail !!!

$ mqrc 2568

2568 0x00000a08 MQRC_CONNECTION_NOT_AVAILABLE

このページの先頭へ

接続モードの確認方法

アプリケーションが意図した接続モードで接続しているかどうかを確認する方法をご紹介します。
※以下、ご紹介する方法は、MQ5.3.1 for HP NonStopでは使用できません。
runmqscコマンドでは、下記のコマンドで表示されるCONNOPTSで確認できます。

MQSC dis conn(*) type(conn) CONNOPTS


Ex. 6.1 接続モードの確認方法

実際にアプリケーションが接続した時に、どんなモードで接続しているかを確認してみます。 mqpgfはMQCNO_*が1つ以上指定されている場合にのみ、MQCONNX()を使用します。MQCNO_*が指定されていない場合は、MQCONN()を呼び出して接続します。 全てデフォルトの状態(qm.iniにDefaultBindType属性を指定していない、MQ_CONNECT_TYPE環境変数の設定なし、MQCNO_*も指定しない状態)で接続します。 ここでは、-s MQCLOSEを指定して、mqpgfが接続されたままの状態にします。

>mqpgf -qm SampleQM -q SampleQ -s MQCLOSE
no message available : SampleQ CompCd=02 ReasonCd=2033
stop before calling MQCLOSE().
Hit Any Key!!!

別のターミナル/コマンド・プロンプトで、次のコマンドを実行します。


テスト結果6.1.1

>mqpcf con -qm SampleQM conn APPLTAG CONNOPTS
1: CONN(414D514353616D706C65514D20202020DB9E515B237FCA01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
2: CONN(414D514353616D706C65514D20202020DB9E515B237FC901) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
3: CONN(414D514353616D706C65514D20202020DB9E515B237FC801) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
4: CONN(414D514353616D706C65514D20202020DB9E515B237FC701) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
5: CONN(414D514353616D706C65514D20202020DB9E515B237FC601) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
6: CONN(414D514353616D706C65514D20202020DB9E515B237FC501) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
7: CONN(414D514353616D706C65514D20202020DB9E515B237FC401) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfqpub.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
8: CONN(414D514353616D706C65514D20202020DB9E515B237FC301) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfqpub.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
9: CONN(414D514353616D706C65514D20202020DB9E515B237FC201) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfqpub.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
10: CONN(414D514353616D706C65514D20202020DB9E515B237FC101) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuf0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
11: CONN(414D514353616D706C65514D20202020DB9E515B237FC001) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuc0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
12: CONN(414D514353616D706C65514D20202020DB9E515B237FBF01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuf0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
13: CONN(414D514353616D706C65514D20202020DB9E515B237FBE01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuf0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
14: CONN(414D514353616D706C65514D20202020DB9E515B237FBD01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuf0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
15: CONN(414D514353616D706C65514D20202020DB9E515B237FBC01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmuf0.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
16: CONN(414D514353616D706C65514D20202020DB9E515B237FDA01) TYPE(CONN) APPLTAG(am\win\mqpcf\Debug\mqpcf.exe) CONNOPTS(MQCNO_SHARED_BINDING)
17: CONN(414D514353616D706C65514D20202020DB9E515B237FD601) TYPE(CONN) APPLTAG(am\win\mqpgf\Debug\mqpgf.exe) CONNOPTS(MQCNO_SHARED_BINDING)
18: CONN(414D514353616D706C65514D20202020DB9E515B237FB201) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqrrmfa.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
19: CONN(414D514353616D706C65514D20202020DB9E515B237FD201) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmur0.exe) CONNOPTS(MQCNO_SHARED_BINDING)
20: CONN(414D514353616D706C65514D20202020DB9E515B237FB101) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzfuma.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)
21: CONN(414D514353616D706C65514D20202020DB9E515B237FD001) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqpcsea.exe) CONNOPTS(MQCNO_SHARED_BINDING)
22: CONN(414D514353616D706C65514D20202020DB9E515B237FCF01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\runmqchi.exe) CONNOPTS(MQCNO_SHARED_BINDING)
23: CONN(414D514353616D706C65514D20202020DB9E515B237FCD01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqzmur0.exe) CONNOPTS(MQCNO_SHARED_BINDING)
24: CONN(414D514353616D706C65514D20202020DB9E515B237FCB01) TYPE(CONN) APPLTAG(es\IBM\MQ\bin64\amqfcxba.exe) CONNOPTS(MQCNO_FASTPATH_BINDING)

*オプションの説明
con: Inquire connection (MQCMD_INQUIRE_CONNECTION) コマンドを実行します。
conn: 接続情報のタイプ(MQIACF_CONN_INFO_TYPE)にMQIACF_CONN_INFO_CONNを指定
CONNOPTS: 接続オプションを表示する。

"mqpgf.exe"は、MQCNO_SHARED_BINDING で接続されていることが分かります。 このコマンドでは、アプリケーション以外の、キューマネージャーのプロセスの接続モードも表示されます。 amqzmur0(再開始可能なプロセス・マネージャー)、amqpcsea(コマンド・サーバー)、runmqchi(チャネル・イニシエーター・プロセス)以外は、MQCNO_FASTPATH_BINDINGが使用されていることが確認できます。

特定のAPPLTAGをもつ情報を表示させることも可能です。 "-ap"の後にプログラム名を指定します。 Unix系のOSの場合は、プログラム名のみ指定(例: mqpgf)しますが、Windowsの場合は下記の様にフルパスの後ろから28文字分を指定することが必要です。


テスト結果6.1.2

>mqpcf con -qm SampleQM -ap am\win\mqpgf\Debug\mqpgf.exe
1: CONN(414D514353616D706C65514D20202020DB9E515B237FD601) TYPE(ALL) APPLDESC() APPLTAG(am\win\mqpgf\Debug\mqpgf.exe) APPLTYPE(USER) ASTATE(NONE) CHANNEL() CONNAME() CONNOPTS(MQCNO_SHARED_BINDING) PID(103768) QMURID (0000000000...) UOWLOG() TID(1) URID(0000000000...) UOWLOGDA() UOWLOGTI() UOWSTATE(MQUOWST_NONE) UOWSTDA() UOWSTTI() URTYPE(QMGR) USERID(mquser)
2: CONN(414D514353616D706C65514D20202020DB9E515B237FD601) TYPE(ALL) OBJNAME(SampleQ) OBJTYPE(QUEUE) ASTATE(NONE) HSTATE(INACTIVE) OPENOPTS(MQOO_INPUT_SHARED) READA(NO)

*オプションの説明
-ap: 表示させるアプリケーションタグ(APPLTAG)

"mqpcf con"実行時、"conn"("display conn"でのtype(conn))または、"handle"("display conn"でのtype(handle))のどちらも指定しない場合は、上の結果の様に、両方が出力されます。 "1:" が runmqscコマンドでの"display conn"の"type(conn)"、"2:"が"type(handle)"指定時に表示される情報です。

fig 6.1

このページの先頭へ

接続モードの変更

接続モードの変更と確認作業を簡単に実施してみます。


Ex. 6.2 qm.iniで接続モードを変更する。

qm.iniの場所は、プラットフォームやMQのバージョンによって変わります。 また、ユーザーが場所を変更することもできます。 参考までに下記はデフォルトの場所です。

Windows(MQ8.0以上): C:\ProgramData\IBM\MQ\qmgrs\<qmgr name>\qm.ini
Unix系のOS: /var/mqm/qmgrs/<qmgr name>/qm.ini
MQ5.3 for HP NonStop: $MQNSKVARPATH/qmgrs/<qmgr name>/qm.ini
MQ8.0 for HP NonStop: $MQINST/qmgrs/<qmgr name>/qm.ini

qm.iniに接続モードを設定する前の状態を確認します。

>mqpgf -qm SampleQM -q SampleQ -s MQCLOSE
no message available : SampleQ CompCd=02 ReasonCd=2033
stop before calling MQCLOSE().
Hit Any Key!!!

>mqpcf con -qm SampleQM conn -ap am\win\mqpgf\Debug\mqpgf.exe CONNOPTS
1: CONN(414D514353616D706C65514D20202020FB00585B20FBEB01) TYPE(CONN) CONNOPTS(MQCNO_SHARED_BINDING)

qm.iniの最終行に次の2行を追加します。 qm.iniの変更を反映させるには、キューマネージャーの再起動が必要ですので、忘れないようにしてください。

Connection:
DefaultBindType=ISOLATED

キューマネージャーの再起動後、改めて接続オプションを確認してみます。


テスト結果6.2

>mqpgf -qm SampleQM -q SampleQ -s MQCLOSE
no message available : SampleQ CompCd=02 ReasonCd=2033
stop before calling MQCLOSE().
Hit Any Key!!!

>mqpcf con -qm SampleQM conn -ap am\win\mqpgf\Debug\mqpgf.exe CONNOPTS
1: CONN(414D514353616D706C65514D202020208494565B23B22E01) TYPE(CONN) CONNOPTS(MQCNO_ISOLATED_BINDING)

MQCNO_ISOLATED_BINDINGで接続されていることが確認できます。

fig 6.2


Ex. 6.3 MQCNO_*オプションを指定して接続モードを変更する。

トラステッド・アプリケーションは、実行するユーザーIDに制限があります。 UNIX系のOSでは、ユーザーID、グループIDとも"mqm"である必要があります。 また、Linuxの場合は、トラステッド32ビット・アプリケーションはサポートされていません。 mqpgfは32ビット・アプリケーションとして作成されていますので、FASTPATHバインディングでは接続できません。 プラットフォームによってことなりますので、詳細は製品マニュアルを参照してください。 次は、MQ8.0 for HP NonStopの例です。

$ id
uid=44031(MQM.MANAGER) gid=171(MQM)

デフォルトの接続モードは、MQCNO_GUARDIAN_BINDINGです。

$ mqpgf -qm SampleQM -q SampleQ -s MQCLOSE
no message available : SampleQ CompCd=02 ReasonCd=2033
MQCMIT success : CompCd=00 ReasonCd=00
stop before calling MQCLOSE().
Hit Any Key!!!

$ mqpcf con -qm SampleQM -ap mqpgf
1: CONN(414D514353616D706C65514D202020205B552CF720004A01) TYPE(ALL) APPLDESC() APPLTAG(mqpgf) APPLTYPE(USER) ASTATE(NONE) CHANNEL() CONNAME() CONNOPTS(MQCNO_GUARDIAN_BINDING) PID(284558155) QMURID(00000000....) UOWLOG() TID(1) URID(00000000....) UOWLOGDA() UOWLOGTI() UOWSTATE(MQUOWST_NONE) UOWSTDA() UOWSTTI() URTYPE(QMGR) USERID(mqm)
2: CONN(414D514353616D706C65514D202020205B552CF720004A01) TYPE(ALL) OBJNAME(SampleQ) OBJTYPE(QUEUE) ASTATE(NONE) HSTATE(INACTIVE) OPENOPTS(MQOO_INPUT_SHARED) READA(NO)

先ほどと同じコマンドに MQCNO_FASTPATH_BINDINGを追加します。 mqpgfはMQCNO_*が指定されたので、MQCONN()でなくMQCNO_FASTPATH_BINDINGを指定してMQCONNX()を呼び出します。

$ mqpgf -qm SampleQM -q SampleQ -s MQCLOSE MQCNO_FASTPATH_BINDING
no message available : SampleQ CompCd=02 ReasonCd=2033
MQCMIT success : CompCd=00 ReasonCd=00
stop before calling MQCLOSE().
Hit Any Key!!!


テスト結果6.3

$ mqpcf con -qm SampleQM conn -ap mqpgf APPLTAG CONNOPTS
1: CONN(414D514353616D706C65514D202020205B552CF720004C01) TYPE(CONN) APPLTAG(mqpgf) CONNOPTS(MQCNO_FASTPATH_BINDING)

MQCNO_FASTPATH_BINDINGに接続モードが変わっています。

fig 6.3


Ex. 6.4 MQ_CONNECT_TYPE環境変数による接続モードの変更

MQCONN()およびMQCNO_STANDARD_BINDING が指定されている MQCONNX()に有効です。

CLIENT: クライアント接続のみが試行されます。
FASTPATH: この値は以前のリリースではサポートされていましたが、現在は指定されても無視されます。
LOCAL: サーバー接続のみが試行されます。 アプリケーションがFASTPATHを指定している場合、通常のサーバー接続にダウングレードされます。
STANDARD: 以前のリリースとの互換性のためのみ。 現在この値はLOCAL として処理されます。

MQ_CONNECT_TYPEにCLIENTを設定して、サーバーのライブラリとリンクされているmqpgfでクライアント接続が可能になるかどうかをテストしてみます。
※このテストは、SampleQMとRemoteQMが別々のマシンに作成されている場合にのみ有効です。

ここでは、SampleQMへクライアント接続を簡単にするために、一旦セキュリティ関連のパラメータを下記の様に無効にします。

MQSC > alter qmgr chlauth(disabled) connauth(' ')
3 : alter qmgr chlauth(disabled) connauth(' ')
AMQ8005: IBM MQ queue manager changed.

CONAUTHは、MQ8.0以上、CHLAUTHはMQ7.1以上で追加されたパラメータです。 変更後、キューマネージャーのセキュリティ情報をリフレッシュします。

MQSC > refresh security
7 : refresh security
AMQ8560: IBM MQ security cache refreshed.

デフォルトのサーバー接続チャネルをmcauserを'mqm'に設定し、どんなユーザーで接続しても'mqm'の許可でアクセスできるようにします。 キューマネージャーがWindowsの場合は'MUSR_MQADMIN'または、'mqm'グループもしくは'Administrators'グループに所属するユーザーに設定してください。

MQSC > alter chl(system.def.svrconn) chltype(svrconn) mcauser('mqm')
5 : alter chl(system.def.svrconn) chltype(svrconn) mcauser('mqm')
AMQ8016: IBM MQ channel changed.

mcauserに指定しようとするユーザーにキューマネージャーへの接続とキューへのアクセス権限があることを確認するには下記のようにします。

>dspmqaut -m SampleQM -t qmgr -p <user name>
エンティティー <user name> はオブジェクト SampleQM について次の許可を持っています:
....
connect
....
>dspmqaut -m SampleQM -t queue -p <user name> -n SampleQ
エンティティー <user name> はオブジェクト SampleQ について次の許可を持っています:
get
browse
put
....

MQクライアントのデフォルトのコードページとキューマネージャーのCCSID(CodedCharSetId)間でコード変換が可能でない場合、2539 MQRC_CHANNEL_CONFIG_ERRORで接続に失敗することがあります。

$ mqpgf -qm SampleQM -q SampleQ -x nnn.nnn.nnn.nnn(nnnn) -tr
[2018/07/25 14:22:19.063] MQCONNX start qmgr: SampleQM Options: 0x00000000
[2018/07/25 14:22:19.563] MQCONNX stop qmgr: SampleQM CompCd=02 ReasonCd=2539
MQCONNX fail : SampleQM CompCd=02 ReasonCd=2539
!!! Queue Manager Connect Fail !!!

$ mqrc 2539

2539 0x000009eb MQRC_CHANNEL_CONFIG_ERROR

このエラーが発生する場合、今回はテストの為にキューマネージャーのCCSIDを一時的に変えます。 例えばMQクライアント側がWindowsの場合、キューマネージャーのCCSIDを819(ASCII)から932(Shift-JIS)に変更します。
※正式な対処方法は、また機会を改めてご説明します。

MQSC > alter qmgr ccsid(932)
2 : alter qmgr ccsid(932)
AMQ8005: IBM MQ queue manager changed.

この変更は即時に有効になるように見えますが、コマンドサーバーなどは再起動が必要になります。 変更を完全に有効にするには、キューマネージャーを再起動するようにしてください。

RemoteQMのマシンからSampleQMへ接続を試みます。 環境変数MQ_COONECT_TYPEが設定されていない場合は、サーバーのライブラリとリンクされたmqpgfは、バインド接続をこころみるので、2059 MQRC_Q_MGR_NOT_AVAILABLEで失敗します。

>echo %MQ_CONNECT_TYPE%
%MQ_CONNECT_TYPE%

>mqpgf -qm SampleQM -q SampleQ -m test -x nnn.nnn.nnn.nnn(nnnn)
MQCONNX fail : SampleQM CompCd=02 ReasonCd=2059
!!! Queue Manager Connect Fail !!!

>mqrc 2059

2059 0x0000080b MQRC_Q_MGR_NOT_AVAILABLE

MQ_CONNECT_TYPEをCLIENTに設定して、もう一度実行します。

>set MQ_CONNECT_TYPE=CLIENT ※Windowsの場合
$ export MQ_CONNECT_TYPE=CLIENT ※Unix系のOSの場合

"-x"で接続先の IPアドレス(リスナーポート) を指定します。 Unix系のOSの場合は、ダブルクォートで囲みます。 Windowsの場合はダブルクォートは不要です。

>mqpgf -qm SampleQM -q SampleQ -x nnn.nnn.nnn.nnn(nnnn) -s MQCLOSE
no message available : SampleQ CompCd=02 ReasonCd=2033
stop before calling MQCLOSE().
Hit Any Key!!!

チャネル名を指定しない場合、mqpgfはデフォルトでSYSTEM.DEF.SVRCONNに接続します。
サーバー/SampleQM側で下記の様にチャネルの接続状況を確認します。


テスト結果6.4

$ mqpcf chs -qm SampleQM -c SYSTEM.DEF.SVRCONN STATUS RAPPLTAG
1: CHLINSTYPE(CURRENT) CHANNEL(SYSTEM.DEF.SVRCONN) STATUS(RUNNING) CHLTYPE(SVRCONN) CONNAME(10.41.207.3) RAPPLTAG(am\win\mqpgf\Debug\mqpgf.exe) STOPREQ(NO) SUBSTATE(RECEIVE)

サーバーのライブラリにリンクされていたmqpgfが、クライアント接続を試行し、問題なく接続できたことが確認できます。

fig 6.4

環境変数を元に戻しておきます。

>set MQ_CONNECT_TYPE= ※Windowsの場合
$ unset MQ_CONNECT_TYPE ※Unix系のOSの場合


Ex. 6.5 MQCNO_CLIENT_BINDINGでクライアント接続を試行させる。

MQCONNX()の接続オプションに指定します。 以下、"Ex. 6.4"と同様の手順で確認してみます。

>echo %MQ_CONNECT_TYPE%
%MQ_CONNECT_TYPE%

>mqpgf -qm SampleQM -q SampleQ -m test -x nnn.nnn.nnn.nnn(nnnn)
MQCONNX fail : SampleQM CompCd=02 ReasonCd=2059
!!! Queue Manager Connect Fail !!!

MQCNO_CLIENT_BINDINGを指定します。

>mqpgf -qm SampleQM -q SampleQ -m test -x nnn.nnn.nnn.nnn(nnnn) -s MQCLOSE MQCNO_CLIENT_BINDING
[2018/07/25 16:28:02.594] 1: message length: 4 put message: test
stop before calling MQCLOSE().
Hit Any Key!!!


テスト結果6.5

$ mqpcf chs -qm SampleQM -c SYSTEM.DEF.SVRCONN STATUS RAPPLTAG
1: CHLINSTYPE(CURRENT) CHANNEL(SYSTEM.DEF.SVRCONN) STATUS(RUNNING) CHLTYPE(SVRCONN) CONNAME(nnn.nnn.nnn.nnn) RAPPLTAG(am\win\mqpgf\Debug\mqpgf.exe) STOPREQ(NO) SUBSTATE(RECEIVE)

この場合も同様に、サーバーのライブラリにリンクされていたmqpgfが、クライアント接続を試行し、問題なく接続できたことが確認できます。

fig 6.5


Ex. 6.6 FASTPATHがダウングレードされる例

MQ_CONNECT_TYPE環境変数に"LOCAL"を設定することで、FASTPATH接続のアプリケーションの接続モードを他のサーバ接続へダウングレードできます。

MQ_CONNECT_TYPEが設定されていない状態で、FASTPATH接続されていることを確認します。

$ echo $MQ_CONNECT_TYPE

$ mqpgf -qm SampleQM -q SampleQ -s MQCLOSE MQCNO_FASTPATH_BINDING
no message available : SampleQ CompCd=02 ReasonCd=2033
MQCMIT success : CompCd=00 ReasonCd=00
stop before calling MQCLOSE().
Hit Any Key!!!

$ mqpcf con -qm SampleQM conn -ap mqpgf APPLTAG CONNOPTS
1: CONN(414D514353616D706C65514D202020205B568F0520003401) TYPE(CONN) APPLTAG(mqpgf) CONNOPTS(MQCNO_FASTPATH_BINDING)

MQ_CONNECT_TYPE環境変数に"LOCAL"を設定して再度接続してみます。

$ export MQ_CONNECT_TYPE=LOCAL
$ echo $MQ_CONNECT_TYPE
LOCAL
$ mqpgf -qm SampleQM -q SampleQ -s MQCLOSE MQCNO_FASTPATH_BINDING
no message available : SampleQ CompCd=02 ReasonCd=2033
MQCMIT success : CompCd=00 ReasonCd=00
stop before calling MQCLOSE().
Hit Any Key!!!


テスト結果6.6

$ mqpcf con -qm SampleQM conn -ap mqpgf APPLTAG CONNOPTS
1: CONN(414D514353616D706C65514D202020205B568F0520003307) TYPE(CONN) APPLTAG(mqpgf) CONNOPTS(MQCNO_GUARDIAN_BINDING)

MQ8.0 for HP NonStopのデフォルトの接続モードである、MQCNO_GUARDIAN_BINDINGにダウングレードされています。

fig 6.6


Ex. 6.7 MQクライアント環境でのサーバー・アプリケーションの挙動

サーバーのライブラリとリンクされたアプリケーションがMQクライアントのみがインストールされている環境で実行された場合の挙動を確認してみます。
インストール環境を確認します。

>dspmqinst
InstName: Installation1
InstDesc:
Identifier: 1
InstPath: C:\Program Files\IBM\MQ
Version: 9.0.3.0
Primary: Yes
State: Available
MSIProdCode: {76218E6C-9695-48DA-BDFB-2E48A9E42CE0}
MSIMedia: 9.0.3 Server
MSIInstanceId: 1

InstName: Installation2
InstDesc:
Identifier: 2
InstPath: C:\Program Files\IBM\MQ_1
Version: 9.1.0.0
Primary: No
State: Available
MSIProdCode: {D210F767-95D5-4AF0-95EE-C3CBA157D68B}
MSIMedia: 9.1 Client
MSIInstanceId: 1

>dspmqver
Name: IBM MQ
Version: 9.1.0.0
Level: p910-L180705
BuildType: IKAP - (Production)
Platform: IBM MQ for Windows (x64 platform)
Mode: 64-bit
O/S: Windows 10 Enterprise x64 Edition, Build 14393
InstName: Installation2
InstDesc:
Primary: No
InstPath: C:\Program Files\IBM\MQ_1
DataPath: C:\ProgramData\IBM\MQ
MaxCmdLevel: 910

Installation2を使用しており、MQ Clientインストールです。
サーバー・ライブラリとリンクされているmqpgfを実行します。


テスト結果6.7

>mqpgf -qm SampleQM -q SampleQ -x 16.147.169.198(18551) -tr -s MQCLOSE
[2018/07/25 18:12:05.193] MQCONNX start qmgr: SampleQM Options: 0x00000000
[2018/07/25 18:12:05.396] MQCONNX stop qmgr: SampleQM CompCd=00 ReasonCd=00
[2018/07/25 18:12:05.396] MQOPEN start ObjectName: SampleQ Options: 0x00000001
[2018/07/25 18:12:05.411] MQOPEN stop ObjectName: SampleQ CompCd=00 ReasonCd=00
[2018/07/25 18:12:05.411] MQGET start Options: 0x00000000
[2018/07/25 18:12:05.443] MQGET stop CompCd=00 ReasonCd=00
[2018/07/25 18:12:05.443] 1: message length: 4 get message : test
stop before calling MQCLOSE().
Hit Any Key!!!

/home/okaqm9/work/cprog/mqpcf: ./mqpcf chs -qm SampleQM -c SYSTEM.DEF.SVRCONN> 1: CHLINSTYPE(CURRENT) CHANNEL(SYSTEM.DEF.SVRCONN) STATUS(RUNNING) CHLTYPE(SVRCONN) CONNAME(10.41.207.3) RAPPLTAG(am\win\mqpgf\Debug\mqpgf.exe) STOPREQ(NO) SUBSTATE(RECEIVE)

しかし、正常にクライアント接続できています。 これは、サーバー(mqm)ライブラリーにリンクしていて、かつデフォルトのSTANDARD BINDINGの場合、基礎となるサーバー・ライブラリーのロードに失敗すると、自動的にクライアント接続が試行される仕様になっている為です。

fig 6.7

これまでのいくつかのテストから、サーバー・ライブラリーとリンクされたアプリケーションでもクライアント接続ができますので、クライアント・ライブラリとリンクさせたアプリケーションを作成することは必須ではないことになります。

このページの先頭へ

共用 (スレッド独立) 接続

1つのプロセスからMQ接続を行う場合、いくつかの制約事項があります。
まず一つ目は、通常の接続オプションでは、1つのプロセスまたはスレッドから、1つのMQ接続しか行うことができません。 これはバインド接続の場合の制限で、クライアント接続ではこの制限はありません。 もし、2つ目の接続をMQCONN()で行おうとすると、2103 MQRC_ANOTHER_Q_MGR_CONNECTED で失敗します。
2つ目は、1つの接続ハンドルを複数のスレッドでの共用です。 メイン・スレッドで呼び出したMQCONN()で取得した接続ハンドルを使用して、他のスレッドでMQOPEN()を呼び出すと、2018 MQRC_HCONN_ERRORで失敗します。 この制約は、バインド接続でもクライアント接続でも同じです。
この2つ要件を可能にするために、共用 (スレッド独立) 接続というものが用意されています。 このタイプの接続ハンドルは、バインド接続でも、クライアント接続でも作成できます。
但し、共用 (スレッド独立) 接続は、XAトランザクションでのグローバル作業単位ではサポートされませんので、その点について注意する必要があります。 グローバル作業単位で使用できないということは、接続しているキューマネージャー毎にローカル作業でコミットすることが必要ということになります。
※XAトランザクションやグローバル作業単位については、機会を改めてご説明します。

共用接続のためのオプションは下記です。 MQCONNX()に渡す、MQCON構造体のOptionsに設定します。

MQCNO_HANDLE_SHARE_NONE 0x00000020 非共用接続を作成する。
MQCNO_HANDLE_SHARE_BLOCK 0x00000040 共用接続が作成され、別のスレッドでMQI呼び出しがその接続を使用している場合は、そのMQI呼び出しが完了するまで待機します。
MQCNO_HANDLE_SHARE_NO_BLOCK 0x00000080 共用接続が作成され、 別のスレッドでMQI呼び出しがその接続を使用している場合は、MQI呼び出しが 2219 MQRC_CALL_IN_PROGRESS で失敗し、直ぐに制御を戻します。


Ex. 6.8 シングル・スレッドから複数のキューマネージャーへ接続

最初に、シングル・スレッドから複数のキューマネージャーへ接続する場合の挙動について確認してみます。 mqpgfは"-qm"でカンマで区切ったキューマネージャーのリストを指定できます。 テストの為にこれまでに作った3つのキューマネージャーに同じ名前のキューをそれぞれ作成します。
このテストは下記3つのキューマネージャーが全て同じマシンに存在する場合のみ有効です。

fig 6.8

$ echo "def ql(LQ1)" | runmqsc SampleQM
$ echo "def ql(LQ1)" | runmqsc RemoteQM
$ echo "def ql(LQ1)" | runmqsc PartialQM

共用接続の為には、MQCNO_HANDLE_SHARE_BLOCKまたはMQCNO_HANDLE_SHARE_NO_BLOCKを使用します。
まず、MQCNO_HANDLE*を指定しない、またはMQCNO_HANDLE_SHARE_NONEを指定した場合の挙動を確認します。 "-tr"を指定すると、簡易APIトレースが表示され、各APIの呼び出され方や呼び出し時のオプションが分かります。


テスト結果6.8.1

$ mqpgf -qm SampleQM,RemoteQM,PartialQM -q LQ1 -tr MQCNO_HANDLE_SHARE_NONE
[18/07/26 15:57:17.867751] MQCONNX start qmgr:SampleQM Options:0x00000020
[18/07/26 15:57:17.930701] MQCONNX stop hcon:20971526 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/07/26 15:57:17.930970] MQCONNX start qmgr:RemoteQM Options:0x00000020
[18/07/26 15:57:17.949155] MQCONNX stop hcon:0 qmgr:RemoteQM CompCd=02 ReasonCd=2103
MQCONNX fail : RemoteQM CompCd=02 ReasonCd=2103
!!! Queue Manager Connect Fail RemoteQM !!!

$ mqrc 2103

2103 0x00000837 MQRC_ANOTHER_Q_MGR_CONNECTED

3つのキューマネージャーを指定していますが、2つめのキューマネージャーの接続で 2103 MQRC_ANOTHER_Q_MGR_CONNECTED がMQCONNX()で返却されています。 mqpgfは接続に失敗したので、その時点で終了しています。

fig 6.9

MQCNO_HANDLE_SHARE_BLOCKに変更してみます。


テスト結果6.8.2

$ mqpgf -qm SampleQM,RemoteQM,PartialQM -q LQ1 -m test -tr MQCNO_HANDLE_SHARE_BLOCK MQPMO_SYNCPOINT
[18/07/26 16:24:38.817780] MQCONNX start qmgr:SampleQM Options:0x00000040
[18/07/26 16:24:38.876475] MQCONNX stop hcon:20971525 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/07/26 16:24:38.876659] MQCONNX start qmgr:RemoteQM Options:0x00000040
[18/07/26 16:24:38.912757] MQCONNX stop hcon:20971527 qmgr:RemoteQM CompCd=00 ReasonCd=00
[18/07/26 16:24:38.912892] MQCONNX start qmgr:PartialQM Options:0x00000040
[18/07/26 16:24:38.958100] MQCONNX stop hcon:20971529 qmgr:PartialQM CompCd=00 ReasonCd=00
[18/07/26 16:24:38.958741] MQOPEN start hcon:20971525 ObjectName:LQ1 Options:0x00000010
[18/07/26 16:24:38.959152] MQOPEN stop hcon:20971525 ObjectName:LQ1 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.959511] 1: message length: 4 put message: test
[18/07/26 16:24:38.959655] MQPUT start hcon:20971525 Options:0x00000000
[18/07/26 16:24:38.966288] MQPUT stop hcon:20971525 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.966422] MQCMIT start hcon:20971525
[18/07/26 16:24:38.967003] MQCMIT stop hcon:20971525 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/07/26 16:24:38.967198] MQCLOSE start hcon:20971525 Options:0x00000000
[18/07/26 16:24:38.976426] MQCLOSE stop hcon:20971525 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.976530] MQOPEN start hcon:20971527 ObjectName:LQ1 Options:0x00000010
[18/07/26 16:24:38.976956] MQOPEN stop hcon:20971527 ObjectName:LQ1 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.977041] 1: message length: 4 put message: test
[18/07/26 16:24:38.977168] MQPUT start hcon:20971527 Options:0x00000000
[18/07/26 16:24:38.982164] MQPUT stop hcon:20971527 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.982252] MQCMIT start hcon:20971527
[18/07/26 16:24:38.982710] MQCMIT stop hcon:20971527 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/07/26 16:24:38.982838] MQCLOSE start hcon:20971527 Options:0x00000000
[18/07/26 16:24:38.987732] MQCLOSE stop hcon:20971527 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.987812] MQOPEN start hcon:20971529 ObjectName:LQ1 Options:0x00000010
[18/07/26 16:24:38.988205] MQOPEN stop hcon:20971529 ObjectName:LQ1 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.988289] 1: message length: 4 put message: test
[18/07/26 16:24:38.988414] MQPUT start hcon:20971529 Options:0x00000000
[18/07/26 16:24:38.994190] MQPUT stop hcon:20971529 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.994299] MQCMIT start hcon:20971529
[18/07/26 16:24:38.994816] MQCMIT stop hcon:20971529 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/07/26 16:24:38.994947] MQCLOSE start hcon:20971529 Options:0x00000000
[18/07/26 16:24:38.996036] MQCLOSE stop hcon:20971529 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.996115] MQDISC start hcon:20971525
[18/07/26 16:24:38.996454] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.996535] MQDISC start hcon:20971527
[18/07/26 16:24:38.996830] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/07/26 16:24:38.996917] MQDISC start hcon:20971529
[18/07/26 16:24:39.021688] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00

今回はシングル・スレッドから正常に3つのキューマネージャーに同時に接続して処理ができています。 各MQIの紐づけは接続ハンドル(hcom)で確認します。 mqpgfは、まず指定されたキューマネージャーのリストに従い、全てのキューマネージャーへ接続します。 その後、指定されたキューマネージャーの順に、MQOPEN()からMQCLOSE()までの処理を行います。 最後に、MQDISC()をキュー・マネージャー分行います。
※前述の通り、グローバル作業単位のサポートはありませんので、MQPMO_SYNCPOINTの場合、キューマネージャー毎にMQCOMIT()を発行することが必要です。

fig 6.10


Ex. 6.9 接続ハンドルをスレッド間で共用する。

次に、接続ハンドルをスレッド間での共用について確認してみます。 最初に、共用接続を使用しない場合の様子を調べます。 mqpgfは"-nt"につづいて起動したスレッド数を指定することができます。 この場合、メイン・スレッドで接続ハンドルを作成し、指定した数の子スレッドでそのハンドルを使用してMQDISC()以外のMQI()を呼び出します。 この例の接続はクライアント・バインディングです。


テスト結果6.9.1

>mqpgf -qm SampleQM -q SampleQ -m test -x nnn.nnn.nnn.nnn(nnnn) MQCNO_CLIENT_BINDING -nt 3 -tr
[2018/07/26 18:02:43.975 tid=0] MQCONNX start qmgr:SampleQM Options:0x00000800
[2018/07/26 18:02:44.116 tid=0] MQCONNX stop hcon:33554438 qmgr:SampleQM CompCd=00 ReasonCd=00
[2018/07/26 18:02:44.131 tid=35720] MQOPEN start hcon:33554438 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:02:44.131 tid=36484] MQOPEN start hcon:33554438 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:02:44.131 tid=33496] MQOPEN start hcon:33554438 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:02:44.131 tid=35720] MQOPEN stop hcon:33554438 ObjectName:SampleQ CompCd=02 ReasonCd=2018
[2018/07/26 18:02:44.131 tid=36484] MQOPEN stop hcon:33554438 ObjectName:SampleQ CompCd=02 ReasonCd=2018
MQOPEN fail : SampleQM SampleQ CompCd=02 ReasonCd=2018
MQOPEN fail : SampleQM SampleQ CompCd=02 ReasonCd=2018
[2018/07/26 18:02:44.131 tid=33496] MQOPEN stop hcon:33554438 ObjectName:SampleQ CompCd=02 ReasonCd=2018
MQOPEN fail : SampleQM SampleQ CompCd=02 ReasonCd=2018
[2018/07/26 18:02:44.147 tid=0] MQDISC start hcon:33554438
[2018/07/26 18:02:44.163 tid=0] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00

>mqrc 2018

2018 0x000007e2 MQRC_HCONN_ERROR

メインスレッド("tid=0")で、MQCONNX()が呼び出され、正常に接続が完了しています。 3つの子スレッド("tid=35720", "tid=36484", "tid=33496")で、その接続ハンドルを使用してMQOPEN()を呼び出しますが、全て2018 MQRC_HCONN_ERRORで異常終了しています。 mqpgfはMQCNO_HANDLE_SHARE_NO_BLOCKを指定すると、2219 MQRC_CALL_IN_PROGRESSが返却された場合、MQIの呼び出しをリトライしません。その為、マルチ・スレッドでのMQI呼び出しを指定する場合は、実際にはMQCNO_HANDLE_SHARE_BLOCKのみが有効です。

fig 6.11

MQCNO_HANDLE_SHARE_BLOCKを指定してみます。


テスト結果6.9.2

>mqpgf -qm SampleQM -q SampleQ -m test -x nnn.nnn.nnn.nnn(nnnn) MQCNO_CLIENT_BINDING -nt 3 -tr MQCNO_HANDLE_SHARE_BLOCK
[2018/07/26 18:19:10.208 tid=0] MQCONNX start qmgr:SampleQM Options:0x00000840
[2018/07/26 18:19:10.333 tid=0] MQCONNX stop hcon:33554437 qmgr:SampleQM CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.333 tid=31108] MQOPEN start hcon:33554437 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:19:10.333 tid=38164] MQOPEN start hcon:33554437 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:19:10.333 tid=38156] MQOPEN start hcon:33554437 ObjectName:SampleQ Options:0x00000010
[2018/07/26 18:19:10.333 tid=31108] MQOPEN stop hcon:33554437 ObjectName:SampleQ CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.333 tid=31108] 1: message length: 4 put message: test
[2018/07/26 18:19:10.349 tid=38164] MQOPEN stop hcon:33554437 ObjectName:SampleQ CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.349 tid=31108] MQPUT start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.349 tid=38156] MQOPEN stop hcon:33554437 ObjectName:SampleQ CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.349 tid=38164] 1: message length: 4 put message: test
[2018/07/26 18:19:10.365 tid=38164] MQPUT start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.365 tid=38156] 1: message length: 4 put message: test
[2018/07/26 18:19:10.365 tid=38156] MQPUT start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.380 tid=31108] MQPUT stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.380 tid=31108] MQCLOSE start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.396 tid=38164] MQPUT stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.396 tid=38164] MQCLOSE start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.396 tid=38156] MQPUT stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.396 tid=38156] MQCLOSE start hcon:33554437 Options:0x00000000
[2018/07/26 18:19:10.412 tid=31108] MQCLOSE stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.427 tid=38164] MQCLOSE stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.443 tid=38156] MQCLOSE stop hcon:33554437 CompCd=00 ReasonCd=00
[2018/07/26 18:19:10.458 tid=0] MQDISC start hcon:33554437
[2018/07/26 18:19:10.490 tid=0] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00

3つのスレッドが1つの接続ハンドルを共有してエラーなく処理を完了しています。

fig 6.12

mqpgfにマルチ・スレッドで処理を実行されるオプションとして、"-nt"の他に、"-ni"というオプションもあります。 "-nt"はメイン・スレッドで作成した接続ハンドルを子スレッド間で共用しますが、"-ni"を指定した場合は、メイン・スレッドから起動された子スレッド内でMQCONN()/MQCONNX()およびMQDISC()を呼び出します。 この場合は、「共用 (スレッド独立) 接続」を作成する(MQCNO_HANDLE_SHARE_BLOCKを指定する)必要はありません。
念のため確認してみます。


テスト結果6.9.3

$ mqpgf -qm SampleQM -q SampleQ -m "thread test" -ni 3 -tr MQPMO_SYNCPOINT
[18/08/07 17:56:12.161562 tid=44144] MQCONN start qmgr:SampleQM
[18/08/07 17:56:12.163679 tid=47424] MQCONN start qmgr:SampleQM
[18/08/07 17:56:12.163723 tid=50704] MQCONN start qmgr:SampleQM
[18/08/07 17:56:12.284938 tid=44144] MQCONN stop hcon:20971526 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:12.285045 tid=44144] MQOPEN start hcon:20971526 ObjectName:SampleQ Options:0x00000010
[18/08/07 17:56:12.285394 tid=44144] MQOPEN stop hcon:20971526 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:12.285453 tid=44144] 1: message length: 11 put message: thread test
[18/08/07 17:56:12.285557 tid=44144] MQPUT start hcon:20971526 Options:0x00000000
[18/08/07 17:56:12.300966 tid=47424] MQCONN stop hcon:20971528 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:12.301005 tid=47424] MQOPEN start hcon:20971528 ObjectName:SampleQ Options:0x00000010
[18/08/07 17:56:12.308055 tid=50704] MQCONN stop hcon:20971530 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308091 tid=50704] MQOPEN start hcon:20971530 ObjectName:SampleQ Options:0x00000010
[18/08/07 17:56:12.308375 tid=44144] MQPUT stop hcon:20971526 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308421 tid=44144] MQCMIT start hcon:20971526
[18/08/07 17:56:12.308476 tid=47424] MQOPEN stop hcon:20971528 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308536 tid=47424] 1: message length: 11 put message: thread test
[18/08/07 17:56:12.308581 tid=47424] MQPUT start hcon:20971528 Options:0x00000000
[18/08/07 17:56:12.308634 tid=50704] MQOPEN stop hcon:20971530 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308673 tid=50704] 1: message length: 11 put message: thread test
[18/08/07 17:56:12.308707 tid=50704] MQPUT start hcon:20971530 Options:0x00000000
[18/08/07 17:56:12.308753 tid=47424] MQPUT stop hcon:20971528 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308787 tid=47424] MQCMIT start hcon:20971528
[18/08/07 17:56:12.308830 tid=50704] MQPUT stop hcon:20971530 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.308870 tid=50704] MQCMIT start hcon:20971530
[18/08/07 17:56:12.309450 tid=44144] MQCMIT stop hcon:20971526 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:12.309516 tid=44144] MQCLOSE start hcon:20971526 Options:0x00000000
[18/08/07 17:56:12.309560 tid=47424] MQCMIT stop hcon:20971528 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:12.309618 tid=47424] MQCLOSE start hcon:20971528 Options:0x00000000
[18/08/07 17:56:12.309660 tid=50704] MQCMIT stop hcon:20971530 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:12.309716 tid=50704] MQCLOSE start hcon:20971530 Options:0x00000000
[18/08/07 17:56:12.309758 tid=44144] MQCLOSE stop hcon:20971526 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.309791 tid=44144] MQDISC start hcon:20971526
[18/08/07 17:56:12.309835 tid=47424] MQCLOSE stop hcon:20971528 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.309866 tid=47424] MQDISC start hcon:20971528
[18/08/07 17:56:12.315516 tid=50704] MQCLOSE stop hcon:20971530 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.315556 tid=50704] MQDISC start hcon:20971530
[18/08/07 17:56:12.316555 tid=44144] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.317559 tid=47424] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/08/07 17:56:12.321606 tid=50704] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00

$ mqpgf -qm SampleQM -q SampleQ -ni 3 -tr MQGMO_SYNCPOINT
[18/08/07 17:56:19.812864 tid=44144] MQCONN start qmgr:SampleQM
[18/08/07 17:56:19.814992 tid=47424] MQCONN start qmgr:SampleQM
[18/08/07 17:56:19.815036 tid=50704] MQCONN start qmgr:SampleQM
[18/08/07 17:56:19.936089 tid=44144] MQCONN stop hcon:20971526 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:19.936178 tid=44144] MQOPEN start hcon:20971526 ObjectName:SampleQ Options:0x00000001
[18/08/07 17:56:19.936448 tid=44144] MQOPEN stop hcon:20971526 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:19.936496 tid=44144] MQGET start hcon:20971526 Options:0x00000000
[18/08/07 17:56:19.936588 tid=47424] MQCONN stop hcon:20971528 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:19.936624 tid=47424] MQOPEN start hcon:20971528 ObjectName:SampleQ Options:0x00000001
[18/08/07 17:56:19.936696 tid=50704] MQCONN stop hcon:20971530 qmgr:SampleQM CompCd=00 ReasonCd=00
[18/08/07 17:56:19.936731 tid=50704] MQOPEN start hcon:20971530 ObjectName:SampleQ Options:0x00000001
[18/08/07 17:56:19.949521 tid=44144] MQGET stop hcon:20971526 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.949560 tid=44144] 1: message length: 4 get message : test
[18/08/07 17:56:19.949636 tid=44144] MQCMIT start hcon:20971526
[18/08/07 17:56:19.949686 tid=47424] MQOPEN stop hcon:20971528 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:19.949757 tid=47424] MQGET start hcon:20971528 Options:0x00000000
[18/08/07 17:56:19.949820 tid=50704] MQOPEN stop hcon:20971530 ObjectName:SampleQ CompCd=00 ReasonCd=00
[18/08/07 17:56:19.949866 tid=50704] MQGET start hcon:20971530 Options:0x00000000
[18/08/07 17:56:19.949924 tid=47424] MQGET stop hcon:20971528 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.949959 tid=47424] 1: message length: 4 get message : test
[18/08/07 17:56:19.949996 tid=47424] MQCMIT start hcon:20971528
[18/08/07 17:56:19.950041 tid=50704] MQGET stop hcon:20971530 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950083 tid=50704] 1: message length: 4 get message : test
[18/08/07 17:56:19.950118 tid=50704] MQCMIT start hcon:20971530
[18/08/07 17:56:19.950521 tid=44144] MQCMIT stop hcon:20971526 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950600 tid=44144] MQCLOSE start hcon:20971526 Options:0x00000000
[18/08/07 17:56:19.950649 tid=47424] MQCMIT stop hcon:20971528 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950714 tid=47424] MQCLOSE start hcon:20971528 Options:0x00000000
[18/08/07 17:56:19.950761 tid=50704] MQCMIT stop hcon:20971530 CompCd=00 ReasonCd=00
MQCMIT success : CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950825 tid=50704] MQCLOSE start hcon:20971530 Options:0x00000000
[18/08/07 17:56:19.950871 tid=44144] MQCLOSE stop hcon:20971526 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950908 tid=44144] MQDISC start hcon:20971526
[18/08/07 17:56:19.950955 tid=47424] MQCLOSE stop hcon:20971528 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.950989 tid=47424] MQDISC start hcon:20971528
[18/08/07 17:56:19.956575 tid=50704] MQCLOSE stop hcon:20971530 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.956619 tid=50704] MQDISC start hcon:20971530
[18/08/07 17:56:19.957617 tid=44144] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.958623 tid=47424] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00
[18/08/07 17:56:19.962197 tid=50704] MQDISC stop hcon:-1 CompCd=00 ReasonCd=00

※"-nt", "-ni"はMQ5.3には対応していません。 また、「共用 (スレッド独立) 接続」はMQ5.3 for HP NonStopではサポートされていません。

fig 6.13

このページの先頭へ

このページの先頭へ