如何在C中发送没有RFH头的MQ消息,或者换句话说,如何使用'C‘库接口发送NonJMS MQ消息?
基本上,有没有什么“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生成的msgs可以被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 ^Bstd::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"...)发布于 2019-09-25 17:26:41
IBM类用于JMS和XMS (C++和.NET)是默认发送RFH2头的惟一API。
下面提到的设置特定于JMS (XMS可能有类似或相同的设置),并告诉API接收消息的应用程序不是JMS应用程序,所以不要发送RFH2头:
((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);如果您使用C发送消息,它将没有一个RFH2头,因此没有设置关闭未发送的内容。
发布于 2019-09-27 16:03:47
C程序处理JMS (又名MQRFH2)消息有两种方法。
正如您所看到的,默认行为是GMO Options字段将MQGMO_PROPERTIES_AS_Q_DEF和队列的属性控制属性设置为MQGMO_PROPERTIES_AS_Q_DEF因此,当应用程序收到消息时,它将具有MQRFH2结构。
如果您将GMO Options字段更改为有MQGMO_PROPERTIES_IN_HANDLE,那么当应用程序获得消息时,它将只接收消息有效负载,所有消息属性都将通过消息句柄可用。
在IBM附带的示例MQ程序中,有一个名为amqsbcg0.c。它有两个构建: amqsbcg (绑定模式)和amqsbcgc (客户端模式)。
它包含3个参数: QueueName、QMgrName和PropertyOptions。
(1)如果在没有任何属性选项或属性选项设置为0的情况下运行GMO,则它将GMO字段设置为MQGMO_PROPERTIES_AS_Q_DEF。因此,如果队列上的消息是JMS消息,那么程序将输出一个MQRFH2结构。
(2)如果将属性选项设置为1,则将GMO字段设置为MQGMO_PROPERTIES_IN_HANDLE。因此,如果队列上的消息是JMS消息,那么程序将输出消息属性和消息有效负载。
https://stackoverflow.com/questions/58102246
复制相似问题