我不能使用Executor和Future来捕获TimeOutException,因为它是1.4
如果方法未完成,我需要在30秒后超时.
//Caller class
public static void main() {
EJBMethod() // has to timeout after 30 seconds
}
//EJB method in some other class
public void EJBMethod() {
}
我想的一种方法是将此方法调用包装在Runnable中,并在方法结束后从run()设置一些volatile布尔值.然后,在调用者中,我们可以在调用该方法后休眠30秒,一旦醒来,我将检查调用者中的布尔值是否为SET.如果没有设置,那么我们需要停止该线程.
最佳答案 在最简单的情况下,你可以使用Thread一个任意的Runnable.
如果要从调用者的角度进行调用阻塞,可以创建一个运行工作线程的“服务”类,并使用Thread.join(long)等待操作完成或在指定的超时后放弃它(特别注意正确处理InterruptedException所以事情不会搞砸了.
Thread.isAlive()将告诉您线程是否完成.
检索结果是一个单独的问题;我想你可以解决这个问题……
[编辑]
快速和肮脏的例子(不要在生产中使用!):
/**
* Actually needs some refactoring
* Also, did not verify for atomicity - should be redesigned
*/
public V theServiceCall(final T param) {
final MyResultBuffer<V> buffer = new MyResultBuffer<V>();
Runnable task = new Runnable() {
public void run() {
V result = ejb.process(param);
buffer.putResult(result);
}
}
Thread t = new Thread(task);
t.setDaemon(true);
t.start();
try {
t.join(TASK_TIMEOUT_MILLIS);
} catch (InterruptedException e) {
// Handle it as needed (current thread is probably asked to terminate)
}
return (t.isAlive()) ? null : buffer.getResult();
}
注意:您可以在Runnable中实现关闭标志,而不是Thread.setDaemon(),因为它将是一个更好的解决方案.
[/编辑]