【问题标题】:IBM WebSphere / MQTT.js : Convert MQHRF2 to MQSTR formatIBM WebSphere / MQTT.js:将 MQHRF2 转换为 MQSTR 格式
【发布时间】:2016-11-14 22:30:36
【问题描述】:

我在 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 应用程序发布时,它会失败。

我尝试了 cmets 中列出的两种方法,但我发现了一个奇怪的事情:根据我使用 MQExplorer(我一直使用的)还是 MQ 控制台,结果会有所不同:

在 MQ 资源管理器上:

在 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”。

【问题讨论】:

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


    【解决方案1】:

    在将某个主题上的发布重定向到队列时,您可能有如下定义:-

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

    将主题字符串“Price/Fruit/Apples”上的发布重定向到队列 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 中有一个参数:Window -> Preferences -> WebSphereMQ Explorer -> Message properties -> 取消选中“Display message properties”,这将阻止它强制它们成为 MQRFH2,然后一切都会好起来的。

    【讨论】:

    • 我完全按照你说的一步一步做了,但它仍然不起作用......也许我们应该检查其他什么?或者,有没有一种可能的方法来删除标题,以便只保留接收到的字符串内容?
    • 当发布来自外部源(这里是 nodeJS)时会发生什么? (cf:编辑帖子)
    • 你用的是什么方法?您是否更改了 SUB 或 QUEUE?如果您更改了 SUB,您是否发布了一条新消息来测试它是否有效?
    • 您能否提供您的 MQRFH2 标头的视图?可能不是为您放置 MQRFH2 标头的主题字符串。也许你有一些东西来注释消息。
    • 我基于以下假设更新了我的答案:从 NodeJS 发布会将与发布/订阅引擎无关的其他项目放入您的消息中,从而导致添加 MQRFH2 标头。如果是这种情况 - 在队列中进行建议的更改是可行的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-18
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多