2011-10-28 10 views
8

私はこれを解決しようと数週間過ごしました。これは、利用可能な2つのPECL拡張(SAMとmqseries)のどれもが長い間更新されていないので忘れてしまったようです。私は両方を試してみましたが、MQがコマンドラインから完全に機能していても、SAMが私に接続を拒否して以来、mqseriesは私をこの時点で一番遠くに持っているようです。私は正常に私のQueueManagerへの接続を作成したのだが、次のステップ私は無残に失敗(MQOPEN)の間です:MQRC_OD_ERRORに変換、または英語で、これは$理由になりPHPを使用してMQに接続しようとしています。ほぼそこにあります

$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); 

は、2044年に移入され、: 'MQOPENまたはMQPUT1呼び出しでは、オブジェクト記述子MQODは無効です'。

私のMQODには何が問題なのですか?

更新#1:この時点でこれは解決されていません。ビルド時に問題を解決するために、プロジェクトを一から再構築しました。私はまだ2044を返すMQOPENに固執しています。サンプルはまだCLIから完璧に実行されるので、これはPECL拡張のインストールに結びついています。かなり最近の64ビットPHP5環境でPHPをインストールして、MQに対してPHPを実行している人がいる場合は、私に教えてください...

更新#2:MQPUT1は私ができない問題で完璧に動作します私の応答を受け取る。この時点では、動作しないのはMQOPENだけです。質問です。 MQOPENが動作しているときにMQOPENが2044を返す原因は何ですか?私はMQOPENを理解していますか? cmqchファイル内

+0

*私はQueueManagerへの接続を正常に作成しましたが、それは次のステップ(MQCONN)中に私が悲惨に失敗したことです... *あなたが失敗したMQOpen上にあることを意味しますか? –

+1

はい、申し訳ありません。私は私の質問を編集しました。 – eriben

+0

私はPHPモジュールに精通していませんが、 'DeviceName'はキュー名の奇妙なキーのようです。 –

答えて

1

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のフィールド名または定数と一致すると思います。

更新:提供されたリンクでthe exampleになると、ハッシュキーは実際に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や他の多くの同様の努力の私の理解では、彼らは上で非常に薄いラッパーであるということですC API。 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モンシニョールはMQODのいずれかのバージョンを受け入れますが、機能のそのレベルにフォールバックします。 v1を使用している場合は、それが動作することをテストできます。それ以降のバージョンのMQODを使用する場合は、追加のフィールドをハッシュに追加する必要があります。

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

+0

です。 $ mqods = array( 'ObjectName' => 'MYPUTQUEUE'、 'ObjectType' => MQOT_Q、 'ObjectQMgrName' => 'MYQUEUEMANAGER');ハッシュ・テーブルを無用に変更しました。 – eriben

+0

定数MQOT_Qが定義されていない限り、その値は1になります。 –

+0

バージョンを4に変更すると別のエラーが発生しました。少なくともMQODを受け入れることを意味します。 4は、cmqc.hを正しく読んだ場合、「現在のバージョン」を意味します。 – eriben

関連する問題