问题描述
我在 .NET Framework 上有一个用户可以与之交互的 Windows 桌面应用程序。有一个“连接”按钮,用于设置 Apache Geode 客户端到 Geode 服务器的连接。
当 Geode Server 关闭时(定位器 - 只有 1 个),桌面应用程序无限期挂起,需要强行关闭。
这是我们如何连接到服务器并无限期地挂在最后一行:
PoolFactory poolFactory = _cache.GetPoolManager()
.CreateFactory()
.SetSubscriptionEnabled(true)
.AddLocator(_host,_port);
return poolFactory.Create(_serviceName);
或者,我已经将它包装在一个不同类型的计时器上以返回,但是当尝试再次运行上述代码(尝试再次连接应用程序)时,池仍在尝试连接。 我试图像这样摧毁它:
//destroy the pool
var poolManager = _cache.GetPoolManager();
if (poolManager != null)
{
var pool = poolManager.Find(_serviceName);
if (pool != null && pool.Destroyed == false)
pool.Destroy();
}
但是 pool.Destroy();
挂起 indefinateley
我怎样才能有一种机制来尝试连接到 Geode 服务器,如果在 10 秒内没有连接则返回,然后离开并能够使用相同的缓存再次尝试连接?
上面的注意是试图重复使用相同的缓存,可能将缓存设置为 null 并重新尝试会起作用,但我正在寻找一种更正确的方法来做到这一点。
解决方法
取决于您使用的 .NET 本机客户端的版本。 10.x connect-timeout
中有一个应该可以工作的属性。此外,您可以将连接代码包装在 try{...}catch{}
块下并处理 Apache.Geode.Client.TimeoutException
和/或 ": No locators available"
的异常。
示例:
var _cache = new CacheFactory()
.Set("log-level","config")
.Set("log-file","C:\temp\test.log")
.Set("connect-timeout","26000ms")
.Create();
_cache.GetPoolManager()
.CreateFactory()
.SetSubscriptionEnabled(true)
.AddLocator(hostname-or-ip",port-number)
.Create("TestPool");