IBM MQ Java类中的持久订阅

时间:2017-08-22 08:42:17

标签: java ibm-mq

我使用了以下方法来创建一个持久的订阅,如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类初始化持久订阅主题的想法?

2 个答案:

答案 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。其他有效选项也可用。