在线程之间共享队列管理器连接

时间:2019-07-03 14:50:22

标签: perl ibm-mq

我正在使用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调用中设置此选项?

2 个答案:

答案 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
                  };