Я использую распространяемые библиотеки IBM MQ (версия 9.3.0.16) для Linux для настройки канала связи между диспетчером очередей и моим примером приложения C++. Моя цель — асинхронно получать сообщения из очереди. Я могу прочитать сообщение синхронно, используя блокирующий вызов get()
(внутри цикла while), что ограничивает производительность и скорость. Поэтому мне нужно использовать асинхронные способы чтения сообщения.
Согласно моим исследованиям, я не нашел в классах C++ прямых функций для асинхронного чтения сообщений или определения обратного вызова. Однако я обнаружил, что есть способ добиться этого, используя метод на основе C.
Я нашел утилиту, которая, как говорят, решает ту же задачу. Я скомпилировал его, но когда я его выполнил, я получил ошибку при регистрации обратного вызова с использованием вызова функции MQCB()
, как показано ниже:
MQCB ended with reason code: 2012
Согласно утилите и
Ниже приведен URL-адрес содержимого, содержащего код .c, который я запускаю: Ссылка на код
К вашему сведению, диспетчер очередей работает в Docker-контейнере, который я запустил и запустил, используя следующий URL-адрес: Менеджер очередей
У меня закончились идеи, и мне нужна помощь.
Я попытался изменить параметр «Общее соединение», но это не сработало. Я все еще получаю ту же ошибку.
В коде приложения я не вижу использования ни потоков, ни библиотеки pthread. Можно предположить, что это не многопоточное приложение. Для его компиляции я использую команду ниже: gcc src2.c -o src2 -I/home/oa/projects/mq/cpp_test_app/inc -L/home/oa/projects/mq/cpp_test_app/lib64 -limqc23gl -limqb23gl -lmqic
... Вы предлагаете мне добавить что-то вроде lpthread в приведенную выше команду gcc?
Вам нужно скомпилировать с резьбовыми опциями. В частности ссылка на _r версии библиотек MQ. Например
cc -o myprog myprog.c -L/opt/mqm/lib64 -I/opt/mqm/inc -lmqm_r
Если вы этого не сделаете, вы обычно получите либо 2012 (при работе в режиме клиента), либо 2488 (при работе в режиме локальных привязок).
Большой! Ваше предложение сработало. Я решил проблему, предоставив библиотеки и добавив варианты _r
в команду GCC.
Является ли ваше приложение многопоточным?