我使用了以下方法来创建一个持久的订阅,如here,
所述public MQTopic accessTopic(java.lang.String topicName,
java.lang.String topicObject,
int options,
java.lang.String altUserId,
java.lang.String subscriptionName)
throws MQException
文档说明subscriptionName - This field is only required if the options parameter specified CMQC.MQSO_DURABLE, but if provided will be used by the queue manager for CMQC.MQSO_NON_DURABLE as well.
所以我创建了如下主题。
qmanager.accessTopic("TOPICSTR",
"TOPICNAME",
CMQC.MQSO_DURABLE,
null,
"subscription")
但是这引发了异常2046(07FE)(RC2046):MQRC_OPTIONS_ERROR。关于如何解决这个问题并使用IBM MQ java类初始化持久订阅主题的想法?
答案 0 :(得分:2)
首先,关于IBM MQ文档的警告:
public MQTopic accessTopic(java.lang.String topicName,
java.lang.String topicObject,
int options,
java.lang.String altUserId,
java.lang.String subscriptionName)
throws MQException
我一直在努力让IBM更新他们的MQ文档,但它们作为糖蜜很慢。问题是,为MQTopic编写Java代码的人使用了错误的字段名称作为变量。因此,当他们从Java代码生成Java Docs时,就会出现错误。
CORRECT定义是:
public MQTopic accessTopic(java.lang.String topicString,
java.lang.String topicObject, /* aka topic name */
int options,
java.lang.String altUserId,
java.lang.String subscriptionName)
throws MQException
第一个字段是'主题字符串'不是'主题名称'。请参阅IBM博客文章的David Ware,其中描述了'主题字符串','主题名称'和'主题对象'。 https://www.ibm.com/developerworks/community/blogs/messaging/entry/mq_topics_but_which_type?lang=en
接下来,你应该包括失败的if quiescing标志:CMQC.MQSO_FAIL_IF_QUIESCING
我通常打开一个非持久的主题:
int openOptions = CMQC.MQSO_CREATE | CMQC.MQSO_FAIL_IF_QUIESCING | CMQC.MQSO_MANAGED | CMQC.MQSO_NON_DURABLE;
MQTopic subscriber = qMgr.accessTopic( topicString,
null,
CMQC.MQTOPIC_OPEN_AS_SUBSCRIPTION,
openOptions);
答案 1 :(得分:1)
我想您需要使用更多选项:
CMQC.MQSO_CREATE | CMQC.MQSO_ALTER | CMQC.MQSO_DURABLE
来自IBM doc:
选项 - 打开主题以进行订阅时,以下显示以下有效选项。如果需要多个选项,可以使用按位OR运算符将值相加或组合。
CMQC.MQSO_CREATE CMQC.MQSO_RESUME CMQC.MQSO_ALTER
如果未指定这些选项,则CMQC.MQSO_CREATE + 假设CMQC.MQSO_ALTER。其他有效选项也可用。