如何检查Tibco EMS专用队列是否有活动的使用者?

问题描述 投票:1回答:1

我正在开发一个应用程序,该应用程序使用具有专有属性集的Tibco EMS队列。我将能够在“活动”和“待机”模式下运行应用程序的多个实例。当应用程序处于待机模式时,它不应为排他队列创建使用者。

我已经实现了以下解决方案,但正在寻找一种更好的方法来做到这一点?

当前正在使用tibemsQueueInfo_GetReceiverCount()来获取接收器计数。但是此API提供了为队列创建的所有使用者,在此之前我必须再调用2个API。

是否有一个仅会返回队列具有活动使用者的API?

status = tibemsAdmin_Create(&admin, server, userName, password, sslParams);
    if (status != TIBEMS_OK)
    {
        baseUtils_print("tibemsAdmin_Create create failed: %s\n", tibemsStatus_GetText(status));
        exit(1);
    }
    baseUtils_print("Amin creation successful\n");

    status = tibemsAdmin_GetQueue(admin, &queueInfo, name);
    if (status != TIBEMS_OK)
    {
        baseUtils_print("tibemsAdmin_GetQueue create failed: %s\n", tibemsStatus_GetText(status));
        exit(1);
    }
    baseUtils_print("Admin GetQueue successful \n");

    status = tibemsQueueInfo_GetReceiverCount(queueInfo, &receiverCount);
    if (status != TIBEMS_OK)
    {
        baseUtils_print("tibemsQueueInfo_GetReceiverCount create failed: %s\n", tibemsStatus_GetText(status));
        exit(1);
    }
    baseUtils_print("Queue: '%s', Active Consumers = '%d'\n",name, receiverCount);
    bool flag = true;
    int prevCount = 0;
    while(receiverCount)
    {
        prevCount = receiverCount;

        if(flag)
        {
            cout << "Consumer in Standby mode..."<<endl;
            flag = false;;
        }
        std::this_thread::sleep_for(std::chrono::seconds(3));       
        status = tibemsAdmin_GetQueue(admin, &queueInfo, name);

        if (status != TIBEMS_OK)
        {
            baseUtils_print("tibemsAdmin_GetQueue create failed: %s\n", tibemsStatus_GetText(status));
            exit(1);
        }

        status = tibemsQueueInfo_GetReceiverCount(queueInfo, &receiverCount);
        if (status != TIBEMS_OK)
        {
            baseUtils_print("tibemsQueueInfo_GetReceiverCount create failed: %s\n", tibemsStatus_GetText(status));
            exit(1);
        }

        if(receiverCount != prevCount)
            cout << "current receiver count = "<<receiverCount<<endl;
    }
    cout << "Consumer mode is Active"<<endl;

    status = tibemsSession_CreateConsumer(session,
            &msgConsumer,destination,NULL,TIBEMS_FALSE);
    if (status != TIBEMS_OK)
    {
        fail("Error creating tibemsMsgConsumer", errorContext);
    }   
c++ tibco ems
1个回答
1
投票
此外,下面的代码将

无效,因此只有在创建消费者并静默等待该消费者之后,才能确定该消费者是否为“第二排”。

while(true) // or better: while( !isStopped() ) ... { status = tibemsSession_CreateConsumer(session, &msgConsumer,destination,NULL,TIBEMS_FALSE); if (status != TIBEMS_OK) { std::this_thread::sleep_for(std::chrono::seconds(3)); cout << "Consumer in Standby mode ??"<<endl; } else { cout << "Consumer mode is Active ??"<<endl; break; } }

© www.soinside.com 2019 - 2024. All rights reserved.