2

MQTT モジュール (mqtt.js) を使用して NodeJS にクライアントがあり、キューにリダイレクトされた WebSphere MQ のトピックと通信します。結果をキューに入れる必要があるため、ソースと宛先の間でトピックを使用します ( MQTT プロトコルはトピックとのみ通信するため)。

NodeJS (ソース) -> Websphere MQ のトピック (中間) -> Websphere MQ のキュー (宛先)

問題は、WebsphereMQ のキューで受信したメッセージが MQHRF2 形式ですが、MQSTR が必要なことです。

mqtt.js 側でフォーマットを指定するプロパティが見つかりませんでした。

IBM Websphere MQ でそれを強制できると思っていましたが、どうすればよいでしょうか? この使用のためにチャネルまたは何かを作成できますか?つまり、受信フォーマットを変換できますか?

よろしくお願いいたします。

構成 :

制約 :

  • WebSphere MQ は v7.5 でなければなりません (そのため、mqlight を使用するために v8 にアップグレードすることはできません)
  • モジュール MQTT.js を使用することをお勧めします

WebSphere MQ エクスプローラーを介してトピックに直接公開すると、正しく機能します。ただし、NodeJS アプリケーションから発行すると失敗します。

コメントにリストされている両方の方法を試してみましたが、奇妙なことがわかりました。

MQ エクスプローラーで: MQ エクスプローラー

MQ コンソールで、次のコマンドを使用: amqsbcg QUEUE_MQTT_VERIF MQTTVerification : 次のコマンドを使用した MQ コンソール: amqsbcg QUEUE_MQTT_VERIF MQTTVerification

ご覧のとおり、コンソールではフォーマット フィールドは空ですが、MQExplorer では MQHRF2 です。メッセージも違います。

したがって、MQConsole の結果は正しく、MQExplorer は変更後も間違った結果を示します。両方で変更が行われた場合にのみ、結果が正しいことに注意してください。

  • サブスクリプション : ALTER SUB(APPLE.PRICES) PSPROP(NONE)
  • Queue : 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)

トピック文字列 '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 エクスプローラーのスクリーンショットから、別のプロパティ mqtt.clientid が存在するため、SUB が PSPROP(NONE) に変更された後も MQRFH2 がまだ存在していることがわかります。MQRFH2 にはトピック・ストリングと同様に他の項目があるため、SUB の変更ではそれらは除去されず、キュー・マネージャーによって追加されたトピック・ストリングのみが除去されます。その場合は、次のことを試してみてください。

別の方法として、トピック文字列を時々そこに置き、それを表示したくないアプリケーションに対してのみ削除する場合は、キューに同様の変更を加えて、アプリケーション コードでオーバーライドして、プロパティを強制的にアプリケーションに配信されますが、それ以外の場合は配信されません。これにより、既に公開されている既存のメッセージを読み取ることもできます (SUB への変更は、既にキューにあるメッセージにさかのぼって適用されません)。

ALTER QLOCAL(PRICES) PROPCTL(NONE)

これは、特に MQGMO_FORCE_RFH2 を要求しないアプリケーションは、MQRFH2 なしでメッセージを見ることを意味します。amqsbcg サンプルは、そのようなアプリケーションの 1 つです。

アプリケーションが MQGMO_FORCE_RFH2 をコーディングした場合でも、MQRFH2 ヘッダー内のプロパティーを表示できます。これは、アプリケーションが明示的に要求しているためです。キューを変更してもそれを止めることはできません。

あなたの問題は、MQ エクスプローラーがメッセージを表示するために選択する方法にあるだけです。MQ エクスプローラーにはパラメーターがあります。ウィンドウ -> 設定 -> WebSphereMQ エクスプローラー -> メッセージ プロパティ -> 「メッセージ プロパティを表示する」のチェックを外すと、強制的に MQRFH2 になるのを止めることができます。

于 2016-07-13T03:17:01.810 に答える