IBM WebSphere / MQTT.js:将MQHRF2转换为MQSTR格式

我在NodeJS中有一个使用MQTT模块(mqtt.js)的客户机与WebSphere MQ主题进行通信,redirect到队列:我需要将结果放在队列中,以便在源和目标之间使用主题因为MQTT协议只与主题进行通信)。

所以我们有: NodeJS(源) – > Websphere的主题MQ(中间) – > Websphere MQ的队列(目标)

问题是WebsphereMQ的队列上收到的消息是MQHRF2格式,但我需要MQSTR。

我没有在mqtt.js中find任何属性来指定格式。

我认为我们可以用IBM Websphere MQ强制它,但是如何? 我可以创build一个频道或任何其他用途,这就是说转换接收格式

在此先感谢您的帮助 !

configuration:

  • MQTT.js v3
  • WebSphere MQ v7.5

限制:

  • WebSphere MQ必须是v7.5(所以我不能升级到v8来使用mqlight)
  • 最好留在模块MQTT.js中

当我通过WebSphere MQ浏览器直接发布主题时,它可以正常工作。 但是,从NodeJS应用程序发布时,它会失败。

我试了两个方法列表中的评论,但我发现了一个奇怪的事情:结果是不同的,如果我使用MQExplorer(我总是使用)或MQ控制台:

在MQ Explorer上: MQ Explorer

在MQ控制台上,使用以下命令:amqsbcg QUEUE_MQTT_VERIF MQTTVerification: MQ控制台,命令:amqsbcg QUEUE_MQTT_VERIF MQTTVerification

正如你所看到的,在控制台中,格式字段是空的,而在MQExplorer上则是MQHRF2。 消息也是不同的。

所以MQConsole的结果是正确的,而MQExplorer在更改后仍然显示错误的结果。 请注意,只有在两者都做了更改后,结果才是正确的:

  • 订阅:ALTER SUB(APPLE.PRICES)PSPROP(NONE)
  • 队列:ALTER QLOCAL(价格)PROPCTL(NONE)

也许问题的根源只是MQExplorer软件上的显示?

编辑:

MQExplorer和MQConsole之间的区别在于MQ Explorer中的参数:窗口 – >首选项 – > WebSphereMQ资源pipe理器 – >消息属性 – >取消选中“显示消息属性”。

将主题上的出版物redirect到队列时,您可能会有这样的定义:

DEFINE QLOCAL(PRICES) DEFINE TOPIC(APPLES) TOPICSTR('Price/Fruit/Apples') DEFINE SUB(APPLE.PRICES) TOPICOBJ(APPLES) DESTCLAS(PROVIDED) DEST(PRICES) 

将主题string“Price / Fruit / Apples”上的出版物redirect到PRICES队列。

然而,你会发现,这样的设置是由队列pipe理器将主题string添加到消息中,从而将MQRFH2头添加到已发布消息的前面。

 Message Descriptor (MQMD) Report :00000000 Message Type :8 (Datagram) Format :'MQHRF2 ' Priority :0 Persistence :0 (Not Persistent) Message Id :414D51204D51473120202020202020202D77835720003702 'AMQ MQG1 -wW .7.' ReplyToQ :' ' ReplyToQMgr :'MQG1 ' [ 102 bytes] Message Content <mqps> <Top> Price/Fruit/Apples </Top> </mqps> Apples are $2/kilo 

要在不更改从队列中读取应用程序的情况下删除它,请对订阅进行更改。

 ALTER SUB(APPLE.PRICES) PSPROP(NONE) 

这将停止队列pipe理器,甚至将主题string放入消息中。

从您的MQ Explorer屏幕截图可以看出,由于存在另一个属性mqtt.clientid,SUB更改为PSPROP(NONE)后,MQRFH2仍然存在。 由于MQRFH2中还有其他项目以及主题string,因此SUB更改不会删除这些 – 只有队列pipe理器添加的主题string。 在这种情况下,您应该尝试以下操作。

如果可选地,您希望在那里有主题string,只有在不希望看到它的应用程序中才能删除它,则可以对队列进行类似的更改,在应用程序代码中可以将其强制为强制属性被交付给申请,但否则他们不会。 这也将允许您读取已发布的任何现有消息(对SUB的更改不会追溯应用于已在队列中的消息)。

 ALTER QLOCAL(PRICES) PROPCTL(NONE) 

这将意味着不具体请求MQGMO_FORCE_RFH2的应用程序将看到没有MQRFH2的消息。 amqsbcg示例就是这样一个应用程序。

如果应用程序代码为MQGMO_FORCE_RFH2,它将仍然能够看到MQRFH2头中的属性,因为它明确要求这样做。 你不能通过改变队列来停止。

您的问题现在只是MQ Explorerselect显示消息的方式。 在MQ资源pipe理器中有一个参数:Window – > Preferences – > WebSphereMQ Explorer – > Message properties – >取消选中“显示消息属性”,这将停止它强制它们成为MQRFH2,然后你会很好。