php - 尝试使用 PHP 连接到 MQ;差不多好了

标签 php integration mq ibm-mq

因此,过去几天我一直在努力解决这个似乎已被遗忘的问题,因为两个可用的 PECL 扩展(SAM 和 mqseries)已经很长时间没有更新了。我已经尝试过这两种方法,而 mqseries 似乎让我在这一点上走得最远,因为 SAM 拒绝让我建立连接,即使 MQ 从命令行运行得很好。我已成功创建到我的 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 不起作用。问题是;是什么导致 MQOPEN 在 MQPUT1 工作时返回 2044,据我所知,这包括 MQOPEN?

最佳答案

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 字段名称或常量。

更新:根据 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 Mgr 将接受任何版本的 MQOD,但会退回到该功能级别。如果您使用 v1,您可以测试它是否有效。如果您想使用更高版本的 MQOD,则需要将其他字段添加到哈希中。

2009 年是“连接中断”。本质上,QMgr 不喜欢某些东西并终止了您的连接。通常,该返回码的有意义的错误消息在 /var/mqm/qmgrs/<qmgrname>/errors/AMQEER01.LOG 中。 .

关于php - 尝试使用 PHP 连接到 MQ;差不多好了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7933705/

相关文章:

java - QueueConnectionFactory.createQueueConnection() 不返回或抛出异常

jms - JMS 中的 Multi-Tenancy

transactions - 如何手动从队列中读取 N 条消息,或者如果在 onmessage() 方法中已经过了 Y 时间?

php - 从复选框数组插入数据库

php - Eloquent - 查找 - 静态调用

matlab - 为什么 MATLAB 为这个积分给出负值?

php - 类型错误 : string indices must be integers, 不是 str - OpenErp

php - 如何获取用户选择的按钮值并在 laravel 5.4 的 Controller 上使用它

php - 如何通过 SFTP 从 PHP 上传文件

java - 您知道在Tomcat中开发prePost的好的教程网站吗?