2

我在 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 资源管理器上: MQ 资源管理器

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

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

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

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

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

编辑:

MQExplorer 和 MQConsole 的区别在于 MQ Explorer 中的参数:Window -> Preferences -> WebSphereMQ Explorer -> Message properties -> 取消选中“Display message properties”。

4

1 回答 1

2

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

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

它将主题字符串“价格/水果/苹果”上的出版物重定向到队列价格。

但是,通过这样的设置,您会发现主题字符串由队列管理器添加到消息中,从而将 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 中有一个参数:窗口 -> 首选项 -> WebSphereMQ Explorer -> 消息属性 -> 取消选中“显示消息属性”,这将阻止它强制它们成为 MQRFH2,然后一切都会好起来的。

于 2016-07-13T03:17:01.810 回答