Как проверить, есть ли у эксклюзивной очереди Tibco EMS активный потребитель? - PullRequest
1 голос
/ 27 сентября 2019

Я занимаюсь разработкой приложения, которое использует очередь EMS Tibco с эксклюзивным набором свойств.Я смогу запустить несколько экземпляров своего приложения в активном и ждущем режиме.Когда приложение находится в режиме ожидания, оно не должно создавать потребителя в исключительной очереди.

Я реализовал приведенное ниже решение, но ищу лучший способ сделать это?

В настоящее время использую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);
    }   

1 Ответ

1 голос
/ 30 сентября 2019

Нет, к сожалению, нет более простого API.Если бы существовал метод «прямого доступа», он был бы на tibemsAdmin, но его нет.И структурно вид API имеет смысл: у вас есть объект администратора, затем вы попадете в объект очереди и затем запросите свойства этого объекта очереди.

Но более интересный вопрос - стоит ли вам действительно заботиться о текущем количестве потребителей?Думаю, нет.Если вы хотите, чтобы ваше приложение работало и создавало потребителя только в том случае, если оно находится в режиме ожидания, как насчет того, чтобы забыть о количестве потребителей и вместо этого всегда создавать потребителя, но игнорировать ошибку, если в режиме ожидания:

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;
    }
}
...