在线程之间共享队列管理器连接
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);
}
我正在使用 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);
}