首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C中不使用RFH报头发送MQ消息?

如何在C中不使用RFH报头发送MQ消息?
EN

Stack Overflow用户
提问于 2019-09-25 15:50:20
回答 2查看 766关注 0票数 0

如何在C中发送没有RFH头的MQ消息,或者换句话说,如何使用'C‘库接口发送NonJMS MQ消息?

基本上,有没有什么“C”等价物

代码语言:javascript
复制
((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

按照我正在进行的“C”MQ调用

代码语言:javascript
复制
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++接收方读取

代码语言:javascript
复制
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
代码语言:javascript
复制
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"...)
EN

回答 2

Stack Overflow用户

发布于 2019-09-25 17:26:41

IBM类用于JMS和XMS (C++和.NET)是默认发送RFH2头的惟一API。

下面提到的设置特定于JMS (XMS可能有类似或相同的设置),并告诉API接收消息的应用程序不是JMS应用程序,所以不要发送RFH2头:

代码语言:javascript
复制
((com.ibm.mq.jms.MQQueue) queue).setTargetClient(JMSC.MQJMS_CLIENT_NONJMS_MQ);

如果您使用C发送消息,它将没有一个RFH2头,因此没有设置关闭未发送的内容。

票数 2
EN

Stack Overflow用户

发布于 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消息,那么程序将输出消息属性和消息有效负载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58102246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档