Не удается подключиться к Websphere MQ Manager с помощью XMS

Этот код воспроизводит проблему:

#include <iostream>
#include <xms.hpp>

int main()
{
    try
    {
        xms::ConnectionFactory factory;

        factory.setIntProperty(XMSC_CONNECTION_TYPE,      XMSC_CT_WMQ);
        factory.setIntProperty(XMSC_WMQ_CONNECTION_MODE,  XMSC_WMQ_CM_CLIENT);
        factory.setStringProperty(XMSC_WMQ_QUEUE_MANAGER, "my.queue.manager");
        factory.setStringProperty(XMSC_WMQ_HOST_NAME,     "my.dev.mq");
        factory.setStringProperty(XMSC_WMQ_CHANNEL,       "my.channel");
        factory.setIntProperty(XMSC_WMQ_PORT,              1414);

         std::cout << "Is Factory Null? => " << factory.isNull() << std::endl;
         xms::Connection conn = factory.createConnection(); //THIS THROWS EXCEPTION
         std::cout << "Is Factory Null? => " << factory.isNull() << std::endl;
    }
    catch(xms::Exception const & e)
    {
         e.dump(std::cout);
    }
}

Он выдает исключение, выводя следующее сообщение:

Is Factory Null? => 0
Exception:
ErrorData =
ErrorCode = 26 (XMS_E_CONNECT_FAILED)
JMS Type  = 1 (XMS_X_GENERAL_EXCEPTION)
Linked Exception:
ErrorData = libmqic_r.so
ErrorCode = 0 (XMS_E_NONE)
JMS Type  = 1 (XMS_X_GENERAL_EXCEPTION)

Есть идеи, что не так с кодом?

Обратите внимание, что devpmmq — это просто псевдоним фактического IP-адреса (хоста). Если я поставлю для него любое случайное/бессмысленное значение, я получу ту же ошибку, что плохо, потому что API должен был выдать лучшее сообщение об ошибке, такое как "хост не найден" или что-то одно в этой строке. Есть ли способ включить дополнительную подробную диагностику?


person Nawaz    schedule 27.05.2014    source источник


Ответы (1)


XMS C/C++ выполняет внутреннюю загрузку клиентских библиотек WebSphere MQ. Проблема в том, что XMS не может найти клиентскую библиотеку WebSphere MQ libmqm_r.so.

Что меня озадачивает, так это то, что код установил XMSC_WMQ_CONNECTION_MODE как XMSC_WMQ_CM_CLIENT, но XMS пытается загрузить libmqm_r.so. Он должен был попытаться загрузить libmqic_r.so.

Вы установили клиент WebSphere MQ? Также версию XMSClients можно загрузить с здесь.

person Shashi    schedule 27.05.2014
comment
Большое спасибо. Теперь все работает (все, что мне нужно было установить, это LD_LIBRARY_PATH, указывающий на каталог, содержащий libmqic_r.so). И вы правы, это должно было быть libmqic_r.so. Это была опечатка (я экспериментировал с разными значениями, и в этом процессе я опубликовал ошибку несоответствия). - person Nawaz; 27.05.2014
comment
Не могли бы вы предоставить мне ссылку на онлайн-документ, в котором объясняется, какие *.so для чего предназначены. Я имею в виду, как я узнаю, нужен ли мне libmqm.so или libmqm_r.so, или любой другой .so в этом отношении. В чем разница между ними? и так далее. - person Nawaz; 28.01.2015
comment
Взгляните на эту ссылку: www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/ - person Shashi; 28.01.2015
comment
Я написал распределенное приложение с использованием XMS. Когда я запускаю это с помощью valgrind, он сообщает Invalid free()/delete/delete[]. Поэтому я написал крошечную программу производитель-потребитель, чтобы воспроизвести эту ошибку, и обнаружил, что когда эта крошечная программа связана с libmqic_r.so, только тогда она сообщает Invalid free()/delete/delete[]. Моя крошечная программа ничего не использует и не вызывает никаких функций из XMS. Простой ссылки на libmqic_r.so достаточно, чтобы возникла ошибка. Не могли бы вы дать мне несколько указателей/предположений, что могло пойти не так? - person Nawaz; 29.01.2015
comment
... трассировка стека, о которой сообщает valgrind, содержит эти две интересные функции: exit из libc и _vgnU_freeres из vg_preloaded.so. Вроде когда программа выходит и библиотека выгружается, она пытается освободить часть памяти, появляется эта ошибка Invalid free.... - person Nawaz; 29.01.2015
comment
Ваша программа завершается с ошибкой или Valgrind показывает это, а приложение не завершается с ошибкой? Если случай прежний, то я бы предложил PMR/Ticket с IBM. - person Shashi; 30.01.2015
comment
Крошечная программа не завершает работу с ошибкой. Просто Valgrind говорит, что Invalid free показывает трассировку стека. Однако реальная программа завершается сбоем блокировки мьютекса с кодом ошибки EINVAL, который согласно документ означает либо 1) приоритет вызывающего потока выше, чем текущий потолок приоритета мьютекса, либо 2) мьютекс не ссылается на инициализированный мьютекс объект. . - person Nawaz; 30.01.2015
comment
.... Последний случай может означать, что есть повреждение памяти, согласно this ответ, который также предлагает использовать valgrind. И valgrind действительно показывает Invalid бесплатно. - person Nawaz; 30.01.2015