Совместное использование менеджера очередей между потоками - PullRequest
1 голос
/ 03 июля 2019

Я подключаюсь к серверу IBM MQSeries с помощью модуля Perl MQClient :: MQSeries в клиентской и серверной установке MQSeries 9 в системе 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?

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Я не знаю Perl, и я не использовал интерфейс Perl MQSeries, но читая справку здесь , он говорит следующее: -

Значение $ ConnectOpts является ссылкой на хеш, ключи которой соответствуют полям структуры MQCO. Это только входное значение.

С помощью $ ConnectOpts могут быть предоставлены две внутренние структуры данных: ClientConn и SSLConfig. Они обеспечивают доступ к опциям MQCNO и MQSCO.

Это, к сожалению, не очень полезно, так как нет такой вещи, как структура MQCO. Я думаю, что это может означать MQCNO. Затем, когда в нем говорится, что ClientConn предоставляет доступ к структуре MQCNO, я думаю, что это может означать структуру MQCD, которая подвешена к структуре MQCNO (поскольку именно так выглядит содержимое ClientConn).

Ваш вопрос сводится к тому, "где я могу поставить флажки опций MQCNO_ *?" и я не думаю, что ответ заключается в том, чтобы поместить их в структуру MQCD ClientConn, поскольку это не то место, где они находятся в собственном API MQ.

Учитывая, что я не знаю, как программировать на 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 голос
/ 03 июля 2019

На основании других языковых привязок это будет

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