如何查看Tibco EMS独享队列是否有活跃消费者?



我正在开发一个应用程序,该应用程序从具有独占属性集的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: %sn", tibemsStatus_GetText(status));
exit(1);
}
baseUtils_print("Amin creation successfuln");
status = tibemsAdmin_GetQueue(admin, &queueInfo, name);
if (status != TIBEMS_OK)
{
baseUtils_print("tibemsAdmin_GetQueue create failed: %sn", 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: %sn", 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: %sn", tibemsStatus_GetText(status));
exit(1);
}
status = tibemsQueueInfo_GetReceiverCount(queueInfo, &receiverCount);
if (status != TIBEMS_OK)
{
baseUtils_print("tibemsQueueInfo_GetReceiverCount create failed: %sn", 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);
}   

不,不幸的是没有更简单的 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;
}
}

最新更新