如何使用rubywmq gem将消息发布到IBM WebsphereMQ TOPIC

时间:2016-12-01 17:19:40

标签: ruby ibm-mq publish-subscribe

我尝试使用rubywmq gem将消息发布到IBM MQ pub / sub主题。我没有看到任何直接从Ruby代码发布主题的方法。

以下是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 Server&amp;客户端v7.5
  • Ruby v2.3.0
  • ruby​​wmq v2.1.1

2 个答案:

答案 0 :(得分:3)

将消息放入主题的别名是将点对点应用转换为pub / sub的方法。由于API调用是PUT而不是PUBLISH,因此没有机制将主题字符串添加到主题对象提供的前缀中。消息将发布到主题对象中定义的主题字符串,不再进一步发布。您的SUB.APP.LOGGER.INPUT订阅应该看到出版物,而不是其他出版物。

发布的代码中还有其他几个问题。制作RFH2标题表明您可能早在v5.3或v6时就依赖于文档。遗憾的是,没有提到MQ服务器所使用的版本或Ruby使用的版本客户端库。

也没有提及“无法成功”的含义。这是否意味着你看到零出版物,即使在SUB.APP.LOGGER.INPUT酒吧看来PUT消息好吗?或者PUT返回了一个错误的原因代码?或者你在SUB.APP.LOGGER.INPUT但是没有其他地方收到消息?

出于调试目的,您可以使用MQ Explorer,amqsput示例或任何其他提供的工具将消息放入别名队列并查找输出。该测试与Ruby测试之间的区别应该有助于诊断问题。

如果您想要较少的推测性回复,请回来并更新您的问题以及其他详细信息。

答案 1 :(得分:2)

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)