传统上,要与JMS应用程序(例如,在IBM WebSphere Application Server中运行的Web服务)进行通信,则需要使用RFH2标头。 这很麻烦,尤其是在RPG中。 RFH2头包括一组固定的头字段,后跟任意数量的数据结构,每个数据结构包含一个长度字段和一个缓冲区,该缓冲区包含定义属性的XML数据。 生成RFH2标头并不难。 只需将复制文件cmqrfh2g包含到您的数据结构中,并根据需要设置的文件夹数量定义所需的长度和数据对即可(不同文件夹中的属性必须成对发送)。 为了获得更大的自由并消除从固定长度字段中发送额外的空格,您还可以动态构建缓冲区。 真正的麻烦在于尝试读取属性,这需要解析另一个应用程序发送的RFH2标头。 尽管RPG完全能够解析具有任意数量的可变长度字段的可变长度报头,但它更适合固定长度,类似记录的数据。
在RPG(实际上是任何ILE语言)中使用RFH2标头的另一个问题是XML数据必须为Unicode。 RPG在此具有原生支持UTF-16的优势。 但是,除非您仅与其他RPG应用程序打交道,否则您从其他应用程序获得的任何RFH2标头很可能都将使用UTF-8,因为这是Linux,Windows和Java的默认设置。 这意味着您几乎可以肯定必须处理iconv,这总是很痛苦的。
随着WebSphere MQ 7.0的发布,MQ获得了新的API调用,从而大大减少了与消息属性进行交互所需的工作量,并消除了生成或解析RFH2标头的需要。 这些是:
MQSETMP –设置消息属性 MQDLTMP –删除消息属性 MQINQMP –查询消息属性除了这些API之外,还添加了其他API来帮助使用消息属性API:
MQCRTMH –创建消息句柄 MQDLTMH –删除消息句柄 MQBUFMH –将消息缓冲区转换为消息句柄 MQMHBUF –将消息句柄转换为消息缓冲区新消息属性API的关键是消息句柄。 消息句柄( MQHMSG )是64位标识符,用于允许应用程序引用消息的属性,类似于使用MQHCONN来引用与队列管理器的连接或使用MQHOBJ来进行连接。请参阅主题或队列。 使用这些新的消息属性API的第一步是创建消息句柄。
dcl-s Hmsg int(20); dcl-ds MQCMHO Qualified; /copy CMQCMHOG end-ds; MQCRTMH(HConn : MQCMHO : HMsg : CompletionCode : Reason);您声明两个变量, HMsg为64位整数和MQCMHO (创建消息句柄选项)结构。 然后,您调用MQCRTMH生成我们的消息句柄。 假设CompletionCode为0 ,您现在有了一个消息句柄,可以使用它使用新的消息属性API。
要查看如何使用MQSETMP设置消息属性,让我们首先看一下MQSETMP的参数:
在本练习中,可以使用MQSMPO和MQPD的默认值。 有关这些参数的更多信息,请参考WebSphere MQ信息中心 。
让我们定义一些变量以使用MQSETMP :
dcl-ds PropName Qualified; /copy QMCHRVG end-ds; dcl-s PropertyName varchar(40); dcl-s PropertyValue varchar(40); dcl-ds MQPD Qualified; /copy CMQPDG end-ds; dcl-ds MQSMPO Qualified; /copy CMQSMPOG end-ds;在此示例中,我们将定义usr.format属性,以通知接收应用程序该消息是XML数据。 首先,设置属性名称。
PropertyName = 'format'; PropertyValue = 'xml'; PropName.VCHRP =