2016-12-01 1 views
2

ruby​​wmq gemを使用してIBM MQ pub/subトピックにメッセージを公開しようとしています。私はRubyコードからトピックに公開する直接の方法を見ません。Rubywmq gemを使用してIBM WebsphereMQ TOPICにメッセージを公開するには

MQ TOPIC、SUBセットアップMQSCを以下に示します。

DEFINE TOPIC(MY_TOPIC) TOPICSTR('COM/APP') 
DEFINE QALIAS(MY_TOPIC_Q) TARGET(MY_TOPIC) TARGTYPE(TOPIC) 

DEFINE QLOCAL(APP.RAW.INPUT) 
DEFINE QLOCAL(APP.VALIDATOR.INPUT) 
DEFINE QLOCAL(APP.ENRICHER.INPUT) 
DEFINE QLOCAL(APP.XFORM.INPUT) 
DEFINE QLOCAL(APP.LOGGER.INPUT) 

DEFINE SUB(SUB.APP.RAW.INPUT)  TOPICOBJ(MY_TOPIC) TOPICSTR('MSG/RAW') DEST(APP.RAW.INPUT) 
DEFINE SUB(SUB.APP.VALIDATOR.INPUT) TOPICOBJ(MY_TOPIC) TOPICSTR('MSG/XML') DEST(APP.VALIDATOR.INPUT) 
DEFINE SUB(SUB.APP.ENRICHER.INPUT) TOPICOBJ(MY_TOPIC) TOPICSTR('MSG/VLD') DEST(APP.ENRICHER.INPUT) 
DEFINE SUB(SUB.APP.XFORM.INPUT)  TOPICOBJ(MY_TOPIC) TOPICSTR('MSG/ENR') DEST(APP.XFORM.INPUT) 
DEFINE SUB(SUB.APP.LOGGER.INPUT) TOPICOBJ(MY_TOPIC) TOPICSTR('#')  DEST(APP.LOGGER.INPUT) 

私もMQRFH2ヘッダー Rubyのコードで話題の別名キューに公開しようとした:

WMQ::QueueManager.connect(:connection_name => conn_name, :channel_name => channel_name, :q_mgr_name=> queue_manager) do |qmgr| 
    message   = WMQ::Message.new 
    message.data = 'Hello World' 
    message.headers = [ 
     { 
     header_type: :rf_header_2, 
     xml: ['<route>COM/APP/MSG/RAW</route>'] 
     } 
    ] 
    message.descriptor[:format] = WMQ::MQFMT_STRING 
    qmgr.put(q_name: 'MY_TOPIC_Q', message: message) 
end 

そしてSUBを追加

DEFINE SUB(SUB.APP.RAW.INPUT) TOPICOBJ(MY_TOPIC) TOPICSTR('MSG/RAW') DEST(APP.RAW.INPUT) PSPROP(RFH2) SELECTOR('route = ''COM/APP/MSG/RAW''') 

成功できませんでした。誰かが問題のある箇所を指摘したり、代替案を提案したりすることができますか?ありがとう。

使用されているソフトウェアのバージョン:

  • IBM WMQサーバー&クライアントV7.5
  • ルビーV2.3.0
  • ruby​​wmq 2.1.1

答えて

1

はを指している必要がありますQALIAS TOPIC に固有のオブジェクト TOPICSTRあなたはを公開します。例:

DEFINE TOPIC(MY_TOPIC_MSG_RAW) TOPICSTR('COM/APP/MSG/RAW') 
DEFINE QALIAS(MY_TOPIC_Q) TARGET(MY_TOPIC_MSG_RAW) TARGTYPE(TOPIC) 
3

トピックの上にエイリアスにメッセージを書き込むことは、ポイントツーポイントのアプリケーションをpub/subに変換する方法です。 APIコールはPUTであり、PUBLISHではないので、トピックオブジェクトによって供給されるプレフィックスにトピック文字列を追加するメカニズムはありません。メッセージは、トピックオブジェクトに定義されているトピック文字列に公開されます。あなたのSUB.APP.LOGGER.INPUTサブスクリプションは出版物を見るべきですが、他のものは見るべきではありません。

投稿されたコードにはいくつかの問題があります。 RFH2ヘッダーの作成は、v5.3やv6のような早い段階からドキュメントに頼っていることを示唆しています。残念ながら、MQサーバがどのバージョンにあるか、どのバージョンのクライアントライブラリがRubyで使用されているかは言及されていません。

「成功できませんでした」という意味の言及もありません。それはあなたが0の出版物を見たことを意味しますか?SUB.APP.LOGGER.INPUTパブでもPUTメッセージが表示されても問題ありませんか?またはPUTが悪質な理由コードを返しましたか?または、SUB.APP.LOGGER.INPUTにメッセージがありますが、それ以外の場所はありませんか?

デバッグの目的で、MQ Explorer、amqsputサンプル、またはその他の付属ツールを使用して、エイリアスキューにメッセージをドロップし、出力を検索することができます。このテストとRubyテストの違いは、問題の診断に役立ちます。

投機的な回答が少ない場合は、質問を追加の詳細で更新してください。

+0

こんにちは、ロブ、ご返信ありがとうございます。使用しているバージョンを表示するように質問を更新しました。私はトピックエクスプローラを使用して、トピックキューエイリアスに送信されたときにそのトピックがメッセージを受信したことを確認できました。ただし、トピックに登録されたキューはメッセージを受信しませんでした。 PSPROPとSELECTORを使用したコンテンツベースルーティングは機能しませんでした。 – Ambal

+1

トピックのエイリアスがトピックオブジェクトのトピック文字列より長いトピック文字列を決して*決して*返さないという問題が残っています。可能なトピックは「COM/APP」だけなので、パブリケーションはサブスクリプションキューに入らず、したがってセレクタが動作することはありません。購読キューにメッセージが届くまで、サブスクライバアプリなしでパブリッシャを実行することをお勧めします。 –

関連する問題