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

IBM WebSphere / MQTT.js : Convert MQHRF2 to MQSTR format

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

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

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

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

我想我们可以用 IBM Websphere MQ 强制执行它,但是怎么做呢?我可以为此用途创建一个频道或任何东西,也就是说转换接收格式 ?

在此先感谢您的帮助!

配置:

约束:

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

我尝试了评论中列出的两种方法,但我发现了一件奇怪的事情:根据我使用 MQExplorer(我一直使用的)或 MQ 控制台,结果是不同的:

在 MQ 资源管理器上:

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

如您所见,在控制台中,格式字段为空,而在 MQExplorer 上为 MQHRF2。消息也不一样。

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

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

编辑:

MQExplorer 和 MQConsole 之间的区别是由于 MQ Explorer 中的参数:Window -> 首选项 -> WebSphereMQ Explorer -> 消息属性 -> 取消选中 "Display message properties"。

当将关于某个主题的出版物重定向到 queue 时,您可能有这样的定义:-

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

将关于主题字符串 'Price/Fruit/Apples' 的出版物重定向到 queue 价格。

然而,通过这样的设置,您会发现 queue 管理器将主题字符串添加到消息中,从而将 MQRFH2 header 添加到您发布的消息的前面留言。

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 /kilo

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

ALTER SUB(APPLE.PRICES) PSPROP(NONE)

这会阻止 queue 经理甚至首先将主题字符串放入消息中。

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

如果有时您希望主题字符串在那里并且只为不想看到它的应用程序删除它,您可以对 queue 进行类似的更改,可以是 over-ridden 在应用程序代码中强制将属性传递给应用程序,否则它们不会。这也将允许您阅读任何已经发布的现有消息(对 SUB 的更改不会追溯应用到 queue 上已经存在的消息)。

ALTER QLOCAL(PRICES) PROPCTL(NONE)

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

如果应用程序编码 MQGMO_FORCE_RFH2,它仍然能够看到 MQRFH2 header 中的属性,因为它已明确要求这样做。您无法通过更改 queue.

来阻止它

您现在的问题只是 MQ Explorer 选择显示消息的方式。 MQ Explorer 中有一个参数:Window -> Preferences -> WebSphereMQ Explorer -> Message properties -> Uncheck "Display message properties" 这将阻止它强制它们成为 MQRFH2,然后你就可以了不错