目前的想法是使用普通的旧解决方法。
一般来说,在 Java 世界中,如果 API 不提供用于获取资源的看门狗方法,您可以将其委托给 a Future
,后者提供get(int timeout, TimeUnit timeUnit)
API 来约束执行。
第一步:资源获取看门狗定时器
所以基本上,我如何在超时范围内获得无状态会话?
private Future<StatelessSession> getStatelessSession(SessionFactory sessionFactory)
{
return asyncTaskExecutor.submit(new Callable<StatelessSession>()
{
@Override
public StatelessSession call() throws Exception
{
return sessionFactory.openStatelessSession();
}
});
}
try {
StatelessSession session = getStatelessSession(sessionFactory).get(3000,TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
// go to step 2
}
第二步:像哲学家那样吃
正如我所说,我的问题看起来基本上像用餐哲学家,只是我们不仅有两个叉子,而且还有勺子和刀子,总共有 4 个。
StatelessSession session1, session2, session3, session4;
for (int i=0; i<MAX_ATTEMPTS;i++) {
try {
session1 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
continue;
}
try {
session2 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session1.close();
continue;
}
try {
session3 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session2.close();
session1.close();
continue;
}
try {
session4 = tryGetSessionOrBoooooom();
} catch(TimeoutException ex) {
session3.close();
session2.close();
session1.close();
continue;
}
}
如果你超越MAX_ATTEMPTS
了会发生什么取决于你,开发者!