2016-07-12 2 views
2

У меня есть клиент в NodeJS, используя модуль MQTT (mqtt.js) для связи с темой WebSphere MQ, перенаправленный в очередь: мне нужен результат в очереди, поэтому я использую тему между источником и пунктом назначения (поскольку протокол MQTT обменивается только с темами).IBM WebSphere/MQTT.js: конвертировать MQHRF2 в формат MQSTR

Итак, мы имеем: NodeJS (источник) -> Тема Websphere MQ (промежуточный) -> Очередь Websphere MQ (назначения)

Проблема заключается в том, что полученные сообщения по очереди WebsphereMQ - формат MQHRF2, но мне нужен MQSTR.

Я не нашел никакого свойства в mqtt.js, чтобы указать формат.

Я предположил, что мы можем заставить его использовать IBM Websphere MQ, но как? Могу ли я создать канал или что-нибудь для этого использования, то есть преобразовать принимаемый формат?

Заранее благодарим за вашу помощь!

Конфигурация:

Сдерживает:

  • WebSphere MQ должен быть v7.5 (так что я не могу перейти на v8 использовать mqlight)
  • Be tter оставаться с модулем 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

Как вы можете видеть, в консоли, поле формата пуст, в то время как на MQExplorer это MQHRF2. Сообщения также разные.

Так что результат на MQConsole прав, тогда как MQExplorer по-прежнему показывает неправильный результат после изменений. Обратите внимание, что результат является правильным только тогда, когда изменения были сделаны на обоих:

  • Подписка: ALTER SUB (APPLE.ЦЕНЫ) PSPROP (NONE)
  • Очередь: ALTER QLOCAL (ЦЕНЫ) PROPCTL (NONE)

Может быть источником проблемы является только дисплей на программное обеспечение MQExplorer?

EDIT:

Разница между MQExplorer и MQConsole было связано с параметром в MQ Explorer: Window -> Preferences -> WebSphereMQ Проводник -> Свойства сообщения -> снимите флажок "Отобразить свойства сообщений".

ответ

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 видно, что MQRFH2 все еще присутствует после того, как SUB был изменен на PSPROP (NONE), потому что есть еще одно свойство - mqtt.clientid. Поскольку в MQRFH2 есть другие элементы, а также строка темы, тогда изменение SUB не удалит их - только строка темы, добавленная менеджером очереди. В этом случае вы должны попробовать следующее.

Если вы хотите, чтобы строка темы там иногда была удалена и удаляла ее только для приложений, которые не хотят ее видеть, вы можете сделать аналогичное изменение в очереди, которая может быть перечеркнута в коде приложения, чтобы принудительные свойства, которые должны быть доставлены в приложение, но в противном случае их не будет. Это также позволит вам читать любые существующие сообщения, которые уже были опубликованы (изменение в SUB не ретроспективно применяется к сообщениям, которые уже находятся в очереди).

ALTER QLOCAL(PRICES) PROPCTL(NONE) 

Это будет означать, что приложения, которые конкретно не запрашивают MQGMO_FORCE_RFH2 появится сообщение без MQRFH2. Образец amqsbcg является одним из таких приложений.

Если код приложения MQGMO_FORCE_RFH2, он все равно сможет видеть свойства в заголовке MQRFH2, потому что он явно спросил об этом. Вы не можете остановить это, изменив очередь.

Ваша проблема возникает только сейчас, когда MQ Explorer выбирает сообщение. В MQ Explorer есть параметр: Окно -> Настройки -> Проводник WebSphereMQ -> Свойства сообщения -> Снимите флажок «Отображать свойства сообщения», что остановит его, чтобы заставить их быть MQRFH2, и тогда все будет хорошо.

+0

Я сделал то, что вы сказали шаг за шагом, но он все еще не работает ... Может быть, нам нужно проверить что-нибудь еще? В качестве альтернативы можно ли удалить заголовок, чтобы сохранить только принятое содержимое строки? –

+0

Что происходит, когда публикация поступает из внешнего источника (здесь nodeJS)? (cf: Редактировать сообщение) –

+0

какой метод вы использовали? Вы изменили SUB или QUEUE? Если вы изменили SUB, вы опубликовали новое сообщение, чтобы проверить, работает ли оно? –