我正在开发一个应用程序,该应用程序使用具有专有属性集的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);
}
无效,因此只有在创建消费者并静默等待该消费者之后,才能确定该消费者是否为“第二排”。
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;
}
}