Недавно я работал над решением, которое интегрируется с серией MQ, и не могу понять, что не так с моим решением. По сути, я пытаюсь подключиться к серверу MQ на мейнфрейме через API MQCONNX, но получаю ошибку 2058.
Вот основной код:
#include <iostream>
#include <cstring>
#include <cmqc.h>
#include <cmqxc.h>
int main(int argc, char** argv)
{
if (argc != 6) {
std::cerr << "Wrong parameters" << std::endl;
return -1;
}
char* queue_manager_name = argv[1]; // maq
char* channel_name = argv[2]; // MQCanal
char* connection_name = argv[3]; // MQConexion
char* transport_type = argv[4]; // MQTransport
std::cout << "Trying connection with parameters:\n";
std::cout << "\tQueue Manager Name (maq) :" << queue_manager_name << std::endl;
std::cout << "\tChannel Name (MQCanal) :" << channel_name << std::endl;
std::cout << "\tConnection Name (MQConexion) :" << connection_name << std::endl;
std::cout << "\tTransport Type (MQTransporte):" << transport_type << std::endl;
// connection
MQCD connection_description = { MQCD_CLIENT_CONN_DEFAULT };
strncpy(connection_description.ChannelName, channel_name, MQ_CHANNEL_NAME_LENGTH);
strncpy(connection_description.ConnectionName, connection_name, MQ_CONN_NAME_LENGTH);
strncpy(connection_description.QMgrName, queue_manager_name, MQ_Q_MGR_NAME_LENGTH);
if (strcmp(transport_type, "TCP") == 0) {
connection_description.TransportType = MQXPT_TCP;
} else if (strcmp(transport_type, "UDP") == 0) {
connection_description.TransportType = MQXPT_UDP;
} else if (strcmp(transport_type, "LU62") == 0) {
connection_description.TransportType = MQXPT_LU62;
} else {
std::cerr << "Invalid transport type, valids are TCP | UDP | LU62" << std::endl;
return -1;
}
MQHCONN conn_handle;
MQLONG comp_code;
MQLONG reason;
MQCNO connection Options = { MQCNO_DEFAULT };
connection_options.ClientConnPtr = &connection_description;
connection_options.Version = MQCNO_VERSION_2;
MQCONNX(queue_manager_name, &connection Options, &conn_handle, &comp_code, &reason);
if (comp_code == MQCC_FAILED) {
std::cerr << "Error to connect against MQ - reason code: " << reason << std::endl;
return -1;
}
MQDISC(&conn_handle, &comp_code, &reason);
return 0;
}
Эта небольшая программа всегда получает ошибку 2058, указывающую, что имя диспетчера очереди неверно или не существует. Но на самом деле существуют и другие приложения, реализованные на других языках (например, Java), подключающиеся к MQ Server и использующие те же параметры.
Среда
Это приложение работает на Solaris 11, и даже несмотря на то, что я использую C API, мой компилятор — g++ (gcc), а ниже — мой make-файл:
CXX = g++
CXXFLAGS = -std=c++98 -pedantic -Wall -Wextra -Wunused-parameter -Wwrite-strings -g -fpermissive -I/usr/include -I/opt/mqm/inc
MQM_LIB = /opt/mqm/lib64
LDFLAGS = -lrt -L$(MQM_LIB) -lmqm
SRCS = src/main.cpp
OBJS = $(SRCS:.cpp=.o)
DIST_FOLDER = dist
TARGET = $(DIST_FOLDER)/mq
RUNTIME_FOLDER = runtime
all: pre-build $(TARGET) copy_runtime
$(TARGET): $(OBJS)
$(CXX) -o $@ $^ $(LDFLAGS)
src/%.o: src/%.cpp
$(CXX) $(CXXFLAGS) -c -o $@ $<
pre-build:
@mkdir -p $(DIST_FOLDER)
clean:
@rm -rf $(DIST_FOLDER)
@rm -f $(OBJS) $(TARGET)
copy_runtime:
@cp $(TARGET) runtime/.
Я не могу понять, в чем проблема. Цените любую помощь.
Чтобы подключиться к администратору очередей на другом компьютере, необходимо использовать клиентское соединение.
Пожалуйста, добавьте следующую строку кода перед звонком MQCONNX
.
connection_options.Options |= MQCNO_CLIENT_BINDING;
Альтернативно, но не обязательно в современных версиях MQ из-за вышеизложенного, ссылка на библиотеку mqic
.
Или, альтернативно, вообще не вносите изменений в код и установите для переменной среды MQ_CONNECT_TYPE значение CLIENT.
Perfect Morag, единственная разница в том, что заданное значение — MQCNO_CLIENT_BINDING вместо MQCNO_CLIENT, по крайней мере, в версии, которую я использую. Очень ценю вашу поддержку. Есть ли у вас аналогичный пример с использованием объектно-ориентированного API, более современного подхода, поскольку остальная часть приложения реализована на C++, а не на языке C. Заранее спасибо!
Вы совершенно правы. Я внес исправление. Я записал ответ по памяти, так как в тот момент меня не было за компьютером. Рад, что был достаточно близко, чтобы разобраться с тобой!
MQ поставляется с примерами на C и C++. Я пишу на C, поэтому у меня нет образцов C++. Было ли что-то еще, в чем вам нужна была помощь? Поднимите еще один вопрос, и мы сможем помочь вам в дальнейшем.
Проверьте AMQERR01.LOG на своем клиентском компьютере.