Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用rubywmq gem将消息发布到ibmwebspheremq主题_Ruby_Ibm Mq_Publish Subscribe - Fatal编程技术网

如何使用rubywmq gem将消息发布到ibmwebspheremq主题

如何使用rubywmq gem将消息发布到ibmwebspheremq主题,ruby,ibm-mq,publish-subscribe,Ruby,Ibm Mq,Publish Subscribe,我正在尝试使用rubywmq gem将消息发布到IBM MQ发布/子主题。我看不到任何直接从Ruby代码发布到主题的方法 以下是MQ主题“子设置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) DEFI

我正在尝试使用rubywmq gem将消息发布到IBM MQ发布/子主题。我看不到任何直接从Ruby代码发布到主题的方法

以下是MQ主题“子设置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
不可能成功。有人能指出问题所在或提出替代方案吗?谢谢

使用的软件版本:

  • IBM WMQ服务器和客户端v7.5
  • Ruby v2.3.0
  • rubywmq v2.1.1
QALIA必须指向特定于要发布到的TOPICSTR的TOPIC对象。例如:

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

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

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

这里也没有提到你所说的“无法成功”是什么意思。这是否意味着即使在
SUB.APP.LOGGER.INPUT
pub上,你也看不到任何发布内容,似乎可以吗?还是看跌期权返回了错误的原因码?或者您在
SUB.APP.LOGGER.INPUT
上收到消息,但在其他地方没有收到消息

出于调试目的,可以使用MQ资源管理器、
amqsput
示例或提供的任何其他工具将消息放到别名队列中并查找输出。该测试和Ruby测试之间的差异应该有助于诊断问题


如果您希望得到更少的推测性回答,请务必回来更新您的问题,并提供更多详细信息。

嗨,罗布,谢谢您的回答。我已更新我的问题,以显示使用的版本。我能够使用MQ资源管理器验证主题在发送到主题队列别名时是否收到消息。但是,订阅该主题的队列没有收到消息。使用PSPROP和选择器的基于内容的路由不起作用。问题在于,主题上的别名永远不会导致主题字符串比主题对象中的字符串长。由于唯一可能的主题是
COM/APP
订阅队列中不会出现任何发布,因此选择器无需执行任何操作。我建议在订阅队列中收到消息之前,在不使用订户应用程序的情况下运行发布服务器。
DEFINE TOPIC(MY_TOPIC_MSG_RAW) TOPICSTR('COM/APP/MSG/RAW')
DEFINE QALIAS(MY_TOPIC_Q) TARGET(MY_TOPIC_MSG_RAW) TARGTYPE(TOPIC)