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

Sharing queue manager connection among threads

我正在使用 CentOS 7 系统上安装的 MQSeries 9 客户端和服务器上的 Perl MQClient::MQSeries 模块连接到 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 ("Application already connected.")。 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 调用中设置此选项?

根据其他语言绑定,它将是

    my $coption = {
                  'ChannelName'    => $channel,
                  'TransportType'  => 'TCP',
                  'ConnectionName' => $host,
                  'Options' => MQCNO_HANDLE_SHARE_NO_BLOCK
                  };

我不知道 Perl,也没有使用过 Perl MQSeries 界面,但是阅读 help here,它说了以下内容:-

The $ConnectOpts value is a hash reference, with keys corresponding to the fields of the MQCO structure. This is an input value only.

With the $ConnectOpts, two interior data structures can be provided: ClientConn and SSLConfig. These provide access to the MQCNO and MQSCO options.

不幸的是,这不是很有帮助,因为没有 MQCO 结构这样的东西。我认为这可能意味着 MQCNO。然后后面说 ClientConn 提供对 MQCNO 结构的访问,我认为这可能意味着 MQCD 结构挂在 MQCNO 结构之外(因为这肯定是 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);
}