【问题标题】:How to check whether a Tibco EMS exclusive queue has an active consumer?如何检查 Tibco EMS 独占队列是否有活跃消费者?
【发布时间】:2019-10-01 14:53:45
【问题描述】:

我正在开发一个使用 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】:

    不,很遗憾,没有更简单的 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;
        }
    }
    

    【讨论】:

    • tibemsSession_CreateConsumer() 始终返回 TIBEMS_OK,即使存在用于独占队列的活动消费者。如果此 API 返回一些其他状态代码,那么它很容易,但事实并非如此。
    • 嗨,Deepak,是的,很遗憾,您完全正确 - 我将编辑此代码。独占访问状态仅在创建消费者后建立。
    猜你喜欢
    • 2020-05-10
    • 2023-03-08
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2018-03-14
    相关资源
    最近更新 更多