Как отправить сообщение MQ без заголовка RFH в C? - PullRequest
1 голос
/ 25 сентября 2019

Как отправить сообщение MQ без заголовка RFH на C или другими словами, как я могу отправить сообщение MQ NonJMS, используя интерфейс библиотеки 'C'?

В принципе, существует ли какой-либо эквивалент C '

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

После звонков 'C' MQ я делаю

MQCONNX(qmgrName, &mqcno, &hConn_, &compCode, &cReason);
MQOPEN(hConn_, &od, openOptions, &hObj_, &openCode, &reason)
MQCRTMH(hConn_, &cmho, &hMsg, &createCode, &reason)
MQSETMP(hConn_, hMsg, &smpo, &prop, &pd, MQTYPE_STRING, propVal.length(), propVal, &compCode, &reason);
pmo.Version = MQPMO_VERSION_3;
pmo.OriginalMsgHandle = hMsg;
MQPUT(hConn_, hObj_, NULL, &pmo, msg._theMessage.length(), buffer, &compCode, &reason);
MQDLTMH(hConn_, &hMsg, &dmho, &compCode, &reason);

pmo.OriginalMsgHandle = hMsg // Эта строка вызывает заголовок RFH

MQПриемник дает следующий вывод.Я использую интерфейс C ++ MQ для получения сообщения, потому что это то, что делает существующий код, и мне нужно убедиться, что сгенерированные сообщения C могут быть прочитаны получателем C ++

2024489 - 2019-09-26 09:00:05.691154 Receiver: Received Message from MQ of size 490
2024489 - 2019-09-26 09:00:05.691163 Receiver: Received Message from MQ --> RFH ^B
std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string (this=0x6ce7938,
    __str="RFH \002\000\000\000P\000\000\000\"\002\000\000\063\003\000\000MQSTR   \000\000\000\000\270\004\000\000(\000\000\000<usr><GROUP_ID>1</GROUP_ID></usr> corrId: \"CORR_ID\"\nchannel: \"HIFI\"\nemp
Ids {\n    empId {\n        type: \"CALLER_NO\"\n        value: \"123456"...)

Ответы [ 2 ]

2 голосов
/ 25 сентября 2019

Классы IBM MQ для API-интерфейса JMS и API-интерфейсы XMS (C ++ и .NET) являются единственными API, которые по умолчанию отправляют заголовок RFH2.

Указанная ниже настройка относится к API JMS.(что-то похожее или одинаковое для XMS) и сообщает API, что приложение, получающее сообщение, не является приложением JMS, поэтому не отправляйте заголовок RFH2:

((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

Если выиспользуя C API для отправки сообщений, он НЕ будет иметь заголовок RFH2, поэтому нет настройки для отключения того, что не отправлено.

0 голосов
/ 27 сентября 2019

Для программы на C существует 2 способа обработки сообщений JMS (он же MQRFH2).

Как вы видели, по умолчанию используется GMO Опции полеиметь MQGMO_PROPERTIES_AS_Q_DEF и атрибут свойства управления очередью для атрибута Совместимость .Следовательно, когда ваше приложение получает сообщение, оно будет иметь структуру MQRFH2.

Если вы изменили поле ГМО Опции на MQGMO_PROPERTIES_IN_HANDLE , то, когда ваше приложение получит сообщение, оно получит только полезную нагрузку сообщения ивсе свойства сообщения будут доступны через дескриптор сообщения.

В примерах программ MQ, включенных в IBM MQ, есть одно, называемое amqsbcg0.c .Существует две сборки: amqsbcg (режим привязки) и amqsbcgc (режим клиента).

Требуется до 3 параметров: QueueName, QMgrName и PropertyOptions

(1) Если вы запустите егобез каких-либо опций свойства или опций свойства, равных 0, тогда в поле опций GMO будет указано MQGMO_PROPERTIES_AS_Q_DEF.Следовательно, если сообщение в очереди является сообщением JMS, то программа выведет структуру MQRFH2.

(2) Если вы запустите его с опциями свойства, установленными в 1, то в поле опций GMO будет установлено значение MQGMO_PROPERTIES_IN_HANDLE.,Следовательно, если сообщение в очереди является сообщением JMS, то программа выведет свойства сообщения, за которыми следует полезная нагрузка сообщения.

...