因此,过去几天我一直在努力解决这个似乎已被遗忘的问题,因为两个可用的 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/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h