8

そのため、利用可能な 2 つの PECL 拡張機能 (SAM と mqseries) のいずれも長い間更新されていないため、この問題を解決するために過去数日間を費やしました。私は両方を試しましたが、MQ はコマンド ラインから完全に動作しますが、SAM が接続を拒否するため、現時点では mqseries が最も効果的です。QueueManager への接続を正常に作成しましたが、次のステップ (MQOPEN) で惨めに失敗します。

$mqcno = array(
        'Version' => MQSERIES_MQCNO_VERSION_2,
        'Options' => MQSERIES_MQCNO_STANDARD_BINDING,
        'MQCD' => array('ChannelName' => '[channel]',
        'ConnectionName' => '[ipnumber]([port])',
        'TransportType' => MQSERIES_MQXPT_TCP)
    );

mqseries_connx('MQED', $mqcno, $conn, $comp_code,$reason);
if ($comp_code !== MQSERIES_MQCC_OK) {
    printf("Connx CompCode:%d Reason:%d Text:%s<br>\n", $comp_code, $reason, $reason);
    exit;
}

$mqods = array('ObjectName'=>'MYPUTQUEUE', 'ObjectType'=>MQOT_Q, 'ObjectQMgrName'=>'MYQUEUEMANAGER');
mqseries_open($conn, $mqods, 
          MQSERIES_MQOO_FAIL_IF_QUIESCING | MQSERIES_MQOO_OUTPUT,
          $obj, $comp_code,$reason);

これにより、$reason に 2044 が入力され、MQRC_OD_ERROR に変換されます。英語では、「MQOPEN または MQPUT1 呼び出しで、オブジェクト記述子 MQOD が無効です」となります。

問題は、MQOD の何が問題なのかということです。

更新 #1: 現時点では、これは解決されていません。ビルド時の問題を解決するために、プロジェクトをゼロから再構築しました。私はまだ 2044 を返す MQOPEN に固執しています。サンプルは引き続き CLI から問題なく実行されるため、これは間違いなく PECL 拡張機能のインストールに関連しています。かなり最近の 64 ビット PHP5 環境で MQ に対して PHP を正常にインストールして実行している人がいる場合は、私に知らせてください...

更新 #2: MQPUT1 は、応答を受信できないという問題に対して問題なく動作します。この時点で、動作しないのは MQOPEN だけです。質問は; MQPUT1 が機能しているときに MQOPEN が 2044 を返す原因は何ですか?

4

1 に答える 1

1

cmqchファイルのMQODは次のようになります。

 /****************************************************************/
 /*  MQOD Structure -- Object Descriptor                         */
 /****************************************************************/


 typedef struct tagMQOD MQOD;
 typedef MQOD  MQPOINTER PMQOD;
 typedef PMQOD MQPOINTER PPMQOD;

 struct tagMQOD {
   MQCHAR4   StrucId;              /* Structure identifier */
   MQLONG    Version;              /* Structure version number */
   MQLONG    ObjectType;           /* Object type */
   MQCHAR48  ObjectName;           /* Object name */
   MQCHAR48  ObjectQMgrName;       /* Object queue manager name */
   MQCHAR48  DynamicQName;         /* Dynamic queue name */
   MQCHAR12  AlternateUserId;      /* Alternate user identifier */
   /* Ver:1 */
   MQLONG    RecsPresent;          /* Number of object records
                                      present */
   MQLONG    KnownDestCount;       /* Number of local queues opened
                                      successfully */
   MQLONG    UnknownDestCount;     /* Number of remote queues opened
                                      successfully */
   MQLONG    InvalidDestCount;     /* Number of queues that failed to
                                      open */
   MQLONG    ObjectRecOffset;      /* Offset of first object record
                                      from start of MQOD */
   MQLONG    ResponseRecOffset;    /* Offset of first response record
                                      from start of MQOD */
   MQPTR     ObjectRecPtr;         /* Address of first object record */
   MQPTR     ResponseRecPtr;       /* Address of first response
                                      record */
   /* Ver:2 */
   MQBYTE40  AlternateSecurityId;  /* Alternate security identifier */
   MQCHAR48  ResolvedQName;        /* Resolved queue name */
   MQCHAR48  ResolvedQMgrName;     /* Resolved queue manager name */
   /* Ver:3 */
   MQCHARV   ObjectString;         /* Object long name */
   MQCHARV   SelectionString;      /* Message Selector */
   MQCHARV   ResObjectString;      /* Resolved long object name*/
   MQLONG    ResolvedType;         /* Alias queue resolved object type */
   /* Ver:4 */
 };

 #define MQOD_DEFAULT {MQOD_STRUC_ID_ARRAY},\
                      MQOD_VERSION_1,\
                      MQOT_Q,\
                      {""},\
                      {""},\
                      {"AMQ.*"},\
                      {""},\
                      0,\
                      0,\
                      0,\
                      0,\
                      0,\
                      0,\
                      NULL,\
                      NULL,\
                      {MQSID_NONE_ARRAY},\
                      {""},\
                      {""},\
                      {MQCHARV_DEFAULT},\
                      {MQCHARV_DEFAULT},\
                      {MQCHARV_DEFAULT},\
                      MQOT_NONE

モジュールがデフォルトを埋めて、ハッシュでオーバーライドできるようになっているのではないかと思います。もしそうなら、「DeviceName」は本当に正しいキーですか?WMQフィールド名または定数と一致すると思います。

更新:提供されたリンクの例によると、ハッシュキーは実際にcmqc.hのフィールド名と一致します。

更新#2はコメントに応答します:cmqc.hで定義されているオブジェクトタイプは次のとおりです。

 /* Object Types */
 #define MQOT_NONE       0
 #define MQOT_Q          1
 #define MQOT_NAMELIST   2
 #define MQOT_PROCESS    3
 #define MQOT_STORAGE_CLASS 4
 #define MQOT_Q_MGR      5
 #define MQOT_CHANNEL    6
 #define MQOT_AUTH_INFO  7
 #define MQOT_TOPIC      8
 #define MQOT_CF_STRUC   10
 #define MQOT_LISTENER   11
 #define MQOT_SERVICE    12
 #define MQOT_RESERVED_1 999

PHP、Perl、および他のほとんどの同様の取り組みについての私の理解は、それらがCAPIの非常に薄いラッパーであるということです。Perlは、ほとんどのコードをcmqc.hおよび他のCインクルードファイルから直接生成するだけなので、すべてのフィールド名とデフォルトはそれらのインクルードファイルと完全に一致します。このモジュールも同様のアプローチを取っているようで、必要に応じて定義された名前とフィールドのデフォルトを使用することを期待しています。

私は次のようなことを考えています:

$mqods = array(
                 'StrucID'=>'OD  ',
                 'Version'=>1.
                 'ObjectType'=>1,
                 'ObjectName'=>'MYPUTQUEUE', 
                 'ObjectQMgrName'=>'MYQUEUEMANAGER'
                 'DynamicQName'='',
                 'AlternateUserId'='',
                 'RecsPresent'=>0,
                 'KnownDestCount'=>0,
                 'UnknownDestCount'=>0,
                 'InvalidDestCount'=>0,
                 'ObjectRecOffset'=>0,
                 'ResponseRecOffset'=>0,
                 'ObjectRecPtr'=>NULL,
                 'ResponseRecPtr'=>NULL
);

アップデート#3は、追加のコメントに対応します。

Q MgrはMQODのすべてのバージョンを受け入れますが、そのレベルの機能にフォールバックします。v1を使用する場合は、それが機能することをテストできます。MQODの新しいバージョンを使用する場合は、ハッシュにフィールドを追加する必要があります。

2009年は「接続が壊れた」です。基本的に、QMgrは何かが気に入らず、接続を終了しました。通常、その戻りコードの意味のあるエラーメッセージはにあり/var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOGます。

于 2011-10-28T19:26:56.903 に答える