我正在使用MQSeries 9客户端上的Perl MQClient :: MQSeries模块和CentOS 7系统上的服务器连接到IBM MQSeries服务器。
我使用两个线程从两个线程连接到队列管理器
sub connectToQueuemanager
{
my ($host, $queuemanager, $channel) = @_;
my $coption = {
'ChannelName' => $channel,
'TransportType' => 'TCP',
'ConnectionName' => $host
};
my $compcode = 0;
my $compres = 0;
my $hconn = MQCONNX ($queuemanager, {'ClientConn' => $coption}, $compcode, $compres);
}
这在第一个线程中工作正常,但在第二个线程中工作不正常-结果是我得到代码2002(“应用程序已连接。”)。 MQSeries版本6没有出现此问题。
从https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.5.0/com.ibm.mq.dev.doc/q025940_.htm开始,可以通过在连接选项中设置MQCNO_HANDLE_SHARE_NO_BLOCK来解决此问题。 Perl模块MQSeries.pm将此列为已知常量之一,但我找不到在MQCONNX连接调用中进行设置的方法。
如何在MQCONNX调用中设置此选项?
答案 0 :(得分:3)
我不知道Perl,也没有使用过Perl MQSeries接口,但是阅读help here时,它显示以下内容:-
$ ConnectOpts值是一个哈希引用,其键对应于MQCO结构的字段。这只是一个输入值。
使用$ ConnectOpts,可以提供两个内部数据结构:ClientConn和SSLConfig。这些提供对MQCNO和MQSCO选项的访问。
不幸的是,这不是很有帮助,因为没有MQCO结构这样的东西。我认为这可能意味着MQCNO。然后稍后说ClientConn提供对MQCNO结构的访问,我认为这可能意味着挂在MQCNO结构之外的MQCD结构(因为这肯定是ClientConn的内容)。
您的问题归结为“我将MQCNO_ *选项标志放在哪里?”我不认为答案是将它们放入MQCD ClientConn结构中,因为在本机MQ API中找不到它们。
鉴于我不知道如何在Perl中编程,而仅使用我的MQ专业知识,这就是我认为代码应该是的样子。如果无法编译,我事先表示歉意,但我希望这会引导您找到解决方案。如果答案很接近,请随时编辑我的答案,但是由于我的Perl的不足,该答案不太正确。
sub connectToQueuemanager
{
my ($host, $queuemanager, $channel) = @_;
my $coption = {
'ChannelName' => $channel,
'TransportType' => 'TCP',
'ConnectionName' => $host
};
my $compcode = 0;
my $compres = 0;
my $hconn = MQCONNX ($queuemanager, {'ClientConn' => $coption,
'Options' => MQCNO_HANDLE_SHARE_NO_BLOCK},
$compcode, $compres);
}
答案 1 :(得分:1)
根据其他语言绑定,它将为
my $coption = {
'ChannelName' => $channel,
'TransportType' => 'TCP',
'ConnectionName' => $host,
'Options' => MQCNO_HANDLE_SHARE_NO_BLOCK
};