如何使用rubywmq gem将消息发布到ibmwebspheremq主题
我正在尝试使用rubywmq gem将消息发布到IBM MQ发布/子主题。我看不到任何直接从Ruby代码发布到主题的方法 以下是MQ主题“子设置MQSC”:如何使用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
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
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)