COBOL2002 ユーザーズガイド


27.3 MSMQアクセスサービスルーチンのインタフェース

インタフェース領域は,COBOLプログラムとMSMQシステムとの間で情報をやり取りするための連絡領域です。インタフェース領域に必要な情報を設定してサービスルーチンを呼び出し,また,処理結果をインタフェース領域から取得します。

MSMQアクセスサービスルーチンで使用するインタフェース領域の形式を次に示します。

表27‒2 MSMQアクセスサービスルーチンで使用するインタフェース領域

記述形式

内容

C

R

E

A

T

E

D

E

L

E

T

E

O

P

E

N

C

L

O

S

E

S

E

N

D

R

E

C

V

L

O

C

A

T

E

01 データ名01.

CALL文のUSINGで指定するインタフェース領域の名前

02 データ名02 PIC X(8).

MSMQのエラーコード※1

02 データ名03

PIC S9(9) USAGE COMP.

詳細コード※2

02 データ名04 PIC X.

検索強制終了フラグ

(0:無効,1:有効)

02 データ名05 PIC X.

アクセスモード

(1:RECEIVE,2:SEND)

02 データ名06 PIC X(2).

メッセージクラス

02 データ名07

PIC S9(9) USAGE COMP.

受信待ち時間

02 データ名08

PIC 9(4) USAGE COMP.

優先順位(0〜7)

02 データ名09 PIC X.

配信方法

(0:高速,1:回復可能)

02 データ名10 PIC X.

ジャーナリング

(0:無効,1:有効)

02 データ名11 PIC X.

配信不能メッセージ

(0:無効,1:有効)

02 データ名12 PIC X.

データ変換フラグ

(0:無効,1:有効)

02 データ名13 PIC X(102).

予約領域

×

×

×

×

×

×

×

(凡例)

○:サービスルーチンの呼び出し時,必ず設定する項目

△:サービスルーチンの完了時,リターン情報として設定される項目

×:初期化後に変更してはいけない項目

空欄:該当しない

CREATE:CBLMQCREATEサービスルーチン

DELETE:CBLMQDELETEサービスルーチン

OPEN:CBLMQOPENサービスルーチン

CLOSE:CBLMQCLOSEサービスルーチン

SEND:CBLMQSENDMSGサービスルーチン

RECV:CBLMQRECEIVEMSGサービスルーチン

LOCATE:CBLMQLOCATEサービスルーチン

注※1

サービスルーチンの戻り値が-1の場合に設定されます。エラーコードの内容についてはMSMQのマニュアルを参照してください。

注※2

サービスルーチンの戻り値が2または-2の場合に設定されます。

詳細コードの内容を,次に示します。

表27‒3 詳細コードの内容

戻り値

詳細コード

エラーの要因

該当する

サービスルーチン

対処

2

1

受信メッセージのラベルが不正である。

CBLMQRECEIVEMSG

メッセージのラベルをテキストデータとして正しい値で再送信し,メッセージを再受信する。

(サービスルーチンの動作)

サービスルーチンは,受信したメッセージのラベルをテキストデータに変換しないで格納した。

2

バイナリデータとして送信されたメッセージを受信し,テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

  • メッセージを再送信し,データ変換フラグを無効にして再受信する。

  • メッセージをテキストデータとして正しい値で再送信し,再受信する。

(サービスルーチンの動作)

サービスルーチンは,受信したメッセージデータをテキストデータに変換しないで格納した。

3

テキストデータとして送信されたメッセージを受信したが,テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージをテキストデータとして正しい値で再送信し,再受信する。

(サービスルーチンの動作)

サービスルーチンは,受信したメッセージデータをテキストデータに変換しないで格納した。

4

受信メッセージのラベルが不正である。かつ,テキストデータとして送信されていないメッセージを受信し,テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

  • メッセージのラベルをテキストデータとして正しい値で再送信し,データ変換フラグを無効にして再受信する。

  • メッセージのラベル,およびメッセージデータをテキストデータとして正しい値で再送信し,再受信する。

(サービスルーチンの動作)

サービスルーチンは,受信したメッセージのラベル,およびメッセージデータをテキストデータに変換しないで格納した。

5

受信メッセージのラベルが不正である。かつ,テキストデータとして送信されたメッセージを受信したが,テキストデータへの変換に失敗した。

CBLMQRECEIVEMSG

メッセージのラベル,およびメッセージデータをテキストデータとして正しい値で再送信し,再受信する。

(サービスルーチンの動作)

サービスルーチンは,受信したメッセージのラベル,およびメッセージデータをテキストデータに変換しないで格納した。

6

検索したキューのパス名が不正である。

CBLMQLOCATE

検索したキューのパス名をテキストデータとして正しい値で再作成し,再度キューのパス名を検索する。

(サービスルーチンの動作)

サービスルーチンは,検索したキューのパス名をテキストデータに変換しないで格納した。

7

検索したキューのパス名が長過ぎる。

CBLMQLOCATE

検索したキューのパス名が,絶対パスで256バイト以下になるようにキューを再作成し,再度キューのパス名を検索する。

(サービスルーチンの動作)

サービスルーチンは,検索したキューのパス名の先頭256バイトだけを格納した。

-2

40

キューをオープンしていない。

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

  • キューをオープンしてからCBLMQCLOSEサービスルーチンを呼び出す。

  • キューをSENDアクセスモードでオープンしてからCBLMQSENDMSGサービスルーチンを呼び出す。

  • キューをRECEIVEアクセスモードでオープンしてからCBLMQRECEIVEMSGサービスルーチンを呼び出す。

41

キューをクローズしていない。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQLOCATE

キューをクローズしてからサービスルーチンを呼び出す。

42

キューのパス名の検索が終了していない。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATEサービスルーチンでの検索を終了してから,ほかのMSMQアクセスサービスルーチンを呼び出す。

50

インタフェース領域の必ず設定する項目に,規定の値が設定されていない。

CBLMQOPEN

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

引数で指定したインタフェース領域に,規定の値を設定してサービスルーチンを呼び出す。

51

データパラメタのデータ長が不正である。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQSENDMSG

CBLMQLOCATE

引数で指定したデータパラメタ領域のデータ長に正しい値を設定してサービスルーチンを呼び出す。

52

データパラメタのデータが不正である。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQSENDMSG

CBLMQLOCATE

引数で指定したデータパラメタ領域のメッセージデータに正しい値を設定してサービスルーチンを呼び出す。

60

コード変換のための環境が整っていない(Unicode機能を使用する場合)。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

コード変換ライブラリが正しくインストールされているか,または使用するコード変換ライブラリが前提バージョンを満たしているかを確認する。

61

コード変換中にエラーが発生した(Unicode機能を使用する場合)。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

UCS-4の範囲(UCS-2の範囲を含む)の文字コードを使用しているか確認する。

99

サービスルーチンを実行するためのメモリが不足している。

CBLMQOPEN

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

削除できるプログラムなどを削除して再実行する。

負数

上記以外の予期しないエラーを検出した。

CBLMQCREATE

CBLMQDELETE

CBLMQOPEN

CBLMQCLOSE

CBLMQSENDMSG

CBLMQRECEIVEMSG

CBLMQLOCATE

当社保守員に連絡する。このとき,詳細コードの値,ソースファイル,登録集原文,およびコンパイルリストファイルが資料として必要になる。

規則
  • インタフェース領域は,最初のMSMQアクセスサービスルーチンを呼び出す前に次の値で初期化しておく必要があります。

    ・英数字項目:SPACE(ただし,予約領域はLOW-VALUE)

    ・数字項目:ZERO

コーディング例

MSMQアクセスサービスルーチンのインタフェース領域のコーディング例を次に示します。

       01 CBLMQINF.
         02 MSMQ-ERRCD       PIC X(8)   VALUE SPACE.
         02 DETAIL-CD        PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 LOCATE-END       PIC X      VALUE SPACE.
         02 QUEUE-ACCESS     PIC X      VALUE SPACE.
         02 MQMSG-CLASS      PIC X(2)   VALUE SPACE.
         02 MQMSG-TIMEOUT    PIC S9(9)  USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-PRIORITY   PIC 9(4)   USAGE COMP
                                        VALUE ZERO.
         02 MQMSG-DELIVERY   PIC X      VALUE SPACE.
         02 MQMSG-JOURNAL    PIC X      VALUE SPACE.
         02 MQMSG-DEADLETTER PIC X      VALUE SPACE.
         02 MSGDATA-CONV     PIC X      VALUE SPACE.
         02 CBLMQ-RESERVE    PIC X(102) VALUE LOW-VALUE.