Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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
IBM MQ Java类中的持久订阅_Java_Ibm Mq - Fatal编程技术网

IBM MQ Java类中的持久订阅

IBM MQ Java类中的持久订阅,java,ibm-mq,Java,Ibm Mq,如前所述,我使用以下方法创建了一个持久订阅 文档说明subscriptionName-仅当选项参数指定为CMQC.MQSO_-DURABLE时,此字段才是必需的,但如果提供,队列管理器也会将其用于CMQC.MQSO_-NON-DURABLE。 因此,我创建了如下主题 qmanager.accessTopic("TOPICSTR", "TOPICNAME", CMQC.MQSO_DURABLE,

如前所述,我使用以下方法创建了一个持久订阅

文档说明
subscriptionName-仅当选项参数指定为CMQC.MQSO_-DURABLE时,此字段才是必需的,但如果提供,队列管理器也会将其用于CMQC.MQSO_-NON-DURABLE。

因此,我创建了如下主题

qmanager.accessTopic("TOPICSTR",
                      "TOPICNAME",
                      CMQC.MQSO_DURABLE,
                      null,
                      "subscription")

但这会引发异常2046(07FE)(RC2046):MQRC_OPTIONS_ERROR。您知道如何解决此问题并使用IBM MQ java类初始化持久订阅主题吗?

我想您需要使用更多选项:

CMQC.MQSO_CREATE | CMQC.MQSO_ALTER | CMQC.MQSO_DURABLE
从IBM文档:

选项-打开订阅主题后,以下有效选项显示如下。如果需要多个选项,可以使用按位or运算符将值相加或组合

CMQC.MQSO_CREATE
CMQC.MQSO_RESUME
CMQC.MQSO_ALTER 
如果未指定这些选项,则CMQC.MQSO_创建+ 假定为CMQC.MQSO_ALTER。其他有效选项也可用


首先,请注意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文档时,错误会被忽略

正确的定义是:

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

接下来,应该包括fail if quiescing标志:CMQC.MQSO\u fail\u if\u 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);

使用int openOptions=CMQC.MQSO_CREATE | CMQC.MQSO_FAIL_IF_QUIESCING | CMQC.MQSO_MANAGED | CMQC.MQSO_DURABLE;我们也可以打开主题进行持久订阅
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);