ruby - 如何使用 ruby​​wmq gem 将消息发布到 IBM WebsphereMQ TOPIC

标签 ruby ibm-mq publish-subscribe

我正在尝试使用 ruby​​wmq gem 将消息发布到 IBM MQ 发布/订阅主题。我没有看到从 Ruby 代码发布到主题的任何直接方式。

以下是 MQ TOPIC,SUB setup 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 header 的主题的别名队列 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
  • ruby v2.3.0
  • rubywmq v2.1.1

最佳答案

通过主题向别名发送消息是一种将点对点应用程序转换为发布/订阅的方法。由于 API 调用是 PUT 而不是 PUBLISH,因此没有机制将主题字符串添加到主题对象提供的前缀中。消息发布到主题对象中定义的主题字符串,不再发布。您的 SUB.APP.LOGGER.INPUT 订阅应该可以看到发布,但看不到其他发布。

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

也没有提及“无法成功”的含义。这是否意味着您看到零发布,即使在 SUB.APP.LOGGER.INPUT 上似乎 PUT 消息正常?或者 PUT 返回错误的原因代码?或者您在 SUB.APP.LOGGER.INPUT 上收到了消息,但在其他地方没有收到消息?

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

如果您不希望得到猜测性的回复,请务必返回并使用更多详细信息更新您的问题。

关于ruby - 如何使用 ruby​​wmq gem 将消息发布到 IBM WebsphereMQ TOPIC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916667/

相关文章:

c# - Rx 如何从 pub/sub 模式创建序列

ruby-on-rails - 将数组作为表列推送到数组,然后保存模型

java - PutApplicationName 与 PutApplName

java - 收到的 JMS 消息被截断

ssl - JMSCMQ0001 : IBM MQ call failed with compcode '2' ('MQCC_FAILED' ) reason '2400' ('MQRC_UNSUPPORTED_CIPHER_SUITE' )

python - 如何接收 STOMP 中丢失的消息?

ruby - 如何在 Ruby 的数组中组合子数组?

mysql - 创建了 <timestamp>_add_devise_to_users.rb 而不是 <timestamp>_devise_create_users.rb

ruby - 如何打印带有前导零的十六进制数字

security - Websphere MQ主题和SSL