Java IBM-MQ PCF用于获取特定主题的订户计数

Java IBM-MQ PCF用于获取特定主题的订户计数,java,ibm-mq,Java,Ibm Mq,我使用的是IBM-MQ,我想使用PCFMessage获取特定主题的订阅者数量 MQQueueManager qmgr = null; PCFMessageAgent agent = null; Hashtable<String, Object> hashtable = new Hashtable<String,Object>(); hashtable.put(MQConstants.HOST_NAME_PROPERTY,"

我使用的是IBM-MQ,我想使用PCFMessage获取特定主题的订阅者数量

    MQQueueManager qmgr = null;
    PCFMessageAgent agent = null;
    
    Hashtable<String, Object> hashtable = new Hashtable<String,Object>();
    hashtable.put(MQConstants.HOST_NAME_PROPERTY,"HOST NAME");
    hashtable.put(MQConstants.PORT_PROPERTY,1414);
    hashtable.put(MQConstants.CHANNEL_PROPERTY,"CHANNEL NAME");
    hashtable.put(MQConstants.USER_ID_PROPERTY, "USER_ID");
    hashtable.put(MQConstants.PASSWORD_PROPERTY, "PASSWORD");
    
    agent = new PCFMessageAgent(qmgr);
    PCFMessage request = new PCFMessage(MQConstants.MQCMD_INQUIRE_TOPIC_STATUS);
    request.addParameter(MQConstants.MQCA_TOPIC_STRING, groupTopic);
我希望通过上面的代码获得订阅groupTopic的用户数。 但是MQConstants.MQIA_SUB_COUNT的值为
它总是固定在48。我想知道我是否错误地使用了PCFMessage,或者是否有其他方法可以获取Topic的订阅者数量。

正如Mark在评论中所说,您应该执行MQSC命令
显示TPSTATUS(xxxx)类型(Topic)
。我更喜欢显式设置PCF参数,以便知道将返回什么

为MQCMD_INQUIRE_TOPIC_STATUS的PCF命令编码,请遵循中的规则:

因此,守则将是:

request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_TOPIC_STATUS); 
request.addParameter(CMQC.MQCA_TOPIC_STRING, groupTopic);
request.addParameter(CMQCFC.MQIACF_TOPIC_STATUS_TYPE, CMQCFC.MQIACF_TOPIC_STATUS);
request.addParameter(CMQCFC.MQIACF_TOPIC_STATUS_ATTRS, new int [] { CMQCFC.MQIACF_ALL });

responses = agent.send(request);

for (int i = 0; i < responses.length; i++)
{
   // Make sure that each response is ok
   if ((responses[i]).getCompCode() == CMQC.MQCC_OK)
   {
      topicStr = responses[i].getStringParameterValue(CMQC.MQCA_TOPIC_STRING);
      topicName= responses[i].getStringParameterValue(CMQC.MQCA_ADMIN_TOPIC_NAME);
      durable  = responses[i].getIntParameterValue(CMQC.MQIA_DURABLE_SUB);
      persist  = responses[i].getIntParameterValue(CMQC.MQIA_TOPIC_DEF_PERSISTENCE);
      inh_Pub  = responses[i].getIntParameterValue(CMQC.MQIA_INHIBIT_PUB);
      inh_Sub  = responses[i].getIntParameterValue(CMQC.MQIA_INHIBIT_SUB);
      pubCount = responses[i].getIntParameterValue(CMQC.MQIA_PUB_COUNT);
      subCount = responses[i].getIntParameterValue(CMQC.MQIA_SUB_COUNT);
   }
}

正如Mark在评论中所说,您应该执行MQSC命令
DISPLAY TPSTATUS(xxxx)TYPE(主题)
。我更喜欢显式设置PCF参数,以便知道将返回什么

为MQCMD_INQUIRE_TOPIC_STATUS的PCF命令编码,请遵循中的规则:

因此,守则将是:

request = new PCFMessage(CMQCFC.MQCMD_INQUIRE_TOPIC_STATUS); 
request.addParameter(CMQC.MQCA_TOPIC_STRING, groupTopic);
request.addParameter(CMQCFC.MQIACF_TOPIC_STATUS_TYPE, CMQCFC.MQIACF_TOPIC_STATUS);
request.addParameter(CMQCFC.MQIACF_TOPIC_STATUS_ATTRS, new int [] { CMQCFC.MQIACF_ALL });

responses = agent.send(request);

for (int i = 0; i < responses.length; i++)
{
   // Make sure that each response is ok
   if ((responses[i]).getCompCode() == CMQC.MQCC_OK)
   {
      topicStr = responses[i].getStringParameterValue(CMQC.MQCA_TOPIC_STRING);
      topicName= responses[i].getStringParameterValue(CMQC.MQCA_ADMIN_TOPIC_NAME);
      durable  = responses[i].getIntParameterValue(CMQC.MQIA_DURABLE_SUB);
      persist  = responses[i].getIntParameterValue(CMQC.MQIA_TOPIC_DEF_PERSISTENCE);
      inh_Pub  = responses[i].getIntParameterValue(CMQC.MQIA_INHIBIT_PUB);
      inh_Sub  = responses[i].getIntParameterValue(CMQC.MQIA_INHIBIT_SUB);
      pubCount = responses[i].getIntParameterValue(CMQC.MQIA_PUB_COUNT);
      subCount = responses[i].getIntParameterValue(CMQC.MQIA_SUB_COUNT);
   }
}

这看起来是一个合理的回答——所有字段似乎都有合理的值。构造PCF查询时,我总是做的第一件事是尝试通过MQSC运行相同的命令,以检查我是否确切知道可能需要哪些参数。因此,如果您运行
DISPLAY TPSTATUS(xxxx)TYPE(主题)
您在子计数中看到了什么值。这看起来是一个合理的响应-所有字段似乎都有合理的值。构造PCF查询时,我总是做的第一件事是尝试通过MQSC运行相同的命令,以检查我是否确切知道可能需要哪些参数。因此,如果您运行
DISPLAY TPSTATUS(xxxx)TYPE(主题)
您在那里看到的子计数值是多少。对不起,我迟到了。我试着按你说的发送PCF命令。结果和以前一样。尽管如此,本主题的(MQIA_SUB_COUNT)固定为48,其余结果相同。主题字符串=groupTopic topicName=持久=1 persist=0 inh_Pub=2 inh_SUB=2 pubCount=0 subCount=48我后来一直在尝试,但是我不知道如何加载主题的订阅。Mark在对您的问题的评论中询问MQSC命令时显示了什么?我了解了最近的一个问题。PCFMessage本身给出了正确的结果,但由于每个查询都是在集群中分组的MQ上执行的,因此订阅的SUS数与预期的不同。也就是说,Sub的MQ和PCFMessage查询的MQ不同。对不起,我迟到了。我试着按你说的发送PCF命令。结果和以前一样。尽管如此,本主题的(MQIA_SUB_COUNT)固定为48,其余结果相同。主题字符串=groupTopic topicName=持久=1 persist=0 inh_Pub=2 inh_SUB=2 pubCount=0 subCount=48我后来一直在尝试,但是我不知道如何加载主题的订阅。Mark在对您的问题的评论中询问MQSC命令时显示了什么?我了解了最近的一个问题。PCFMessage本身给出了正确的结果,但由于每个查询都是在集群中分组的MQ上执行的,因此订阅的SUS数与预期的不同。也就是说,Sub的MQ和带有PCFMessage的查询的MQ是不同的。
DISPLAY TPSTATUS(xxxx) TYPE(TOPIC) ALL