我尝试使用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''')
无法成功。有谁可以请指出问题所在或建议替代方案?感谢。
使用的软件版本:
答案 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)