【问题标题】:Sharing queue manager connection among threads在线程之间共享队列管理器连接
【发布时间】:2019-07-04 06:37:31
【问题描述】:

我正在使用 MQSeries 9 客户端上的 Perl MQClient::MQSeries 模块连接到 IBM MQSeries 服务器,并在 CentOS 7 系统上安装服务器。

我使用两个线程连接到队列管理器

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

【问题讨论】:

    标签: perl ibm-mq


    【解决方案1】:

    我不了解 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);
    }
    

    【讨论】:

    • 谢谢,这行得通。我现在可以从两个线程打开两个连接。
    • 很高兴听到此解决方案对您有用。如果您对它感到满意,请记住接受答案(答案旁边的勾号)。干杯!
    • P.S.我已尝试联系引用文档的所有者以修复它。
    【解决方案2】:

    基于其他语言绑定,它将是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 1970-01-01
      • 2012-04-12
      • 2018-06-25
      相关资源
      最近更新 更多