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

时间:2016-07-12 15:20:24

标签: node.js format ibm-mq mqtt telemetry

我在NodeJS中有一个客户端使用MQTT模块(mqtt.js)与WebSphere MQ的主题进行通信,重定向到队列:我需要将结果放在队列中,所以我在源和目的地(因为MQTT协议仅与主题通信)。

所以我们有:   NodeJS(来源) - > Websphere MQ主题(中级) - > Websphere MQ队列(目标)

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

我没有在mqtt.js端找到任何属性来指定格式。

我想我们可以用IBM Websphere MQ强制它,但是如何?我可以创建一个频道或任何用于此用途的内容,即转换接收格式吗?

提前感谢您的帮助!

配置:

约束:

  • WebSphere MQ必须是v7.5(因此我无法升级到v8以使用mqlight)
  • 更好地使用模块MQTT.js

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

我在注释中尝试了两种方法,但我发现了一个奇怪的结果:根据我是否使用MQExplorer(我经常使用的)或MQ控制台,结果会有所不同:

在MQ Explorer上: MQ Explorer

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

如您所见,在控制台中,format字段为空,而在MQExplorer上则为MQHRF2。消息也不同。

因此MQConsole上的结果是正确的,而MQExplorer在更改后仍然显示错误的结果。 请注意,只有在两者都进行了更改时结果才正确:

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

问题的根源可能只是MQExplorer软件上的显示?

修改

MQExplorer和MQConsole之间的区别是由于MQ Explorer中的参数:Window - >偏好 - > WebSphereMQ Explorer - >消息属性 - >取消选中"显示消息属性"。

1 个答案:

答案 0 :(得分:2)

当将关于主题的出版物重定向到队列时,您可能会有如下定义: -

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

重定向关于主题字符串' Price / Fruit / Apples'到队列价格。

然而,您将通过这样的设置找到的是,队列管理器将主题字符串添加到消息中,从而将MQRFH2标头添加到已发布消息的前面。

Message Descriptor (MQMD)
Report       :00000000
Message Type :8 (Datagram)
Format       :'MQHRF2  '
Priority     :0
Persistence  :0 (Not Persistent)
Message Id   :414D51204D51473120202020202020202D77835720003702
              'AMQ MQG1        -w.W .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)

这会阻止队列管理器,甚至首先将主题字符串放入消息中。

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

如果您希望有时会在主题字符串中删除主题字符串,并且仅为不希望看到它的应用程序删除它,您可以对队列进行类似的更改,这可能会在应用程序代码中被覆盖强制将属性传递给应用程序,但否则他们不会。这还允许您读取已发布的任何现有消息(对SUB的更改不会追溯应用于队列中已有的消息)。

ALTER QLOCAL(PRICES) PROPCTL(NONE)

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

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

现在只有MQ Explorer选择显示消息的方式才能解决您的问题。 MQ Explorer中有一个参数:Window - &gt;偏好 - &gt; WebSphereMQ Explorer - &gt;消息属性 - &gt;取消选中&#34;显示消息属性&#34;这会阻止它们成为MQRFH2,然后你就会变得很好。