我有一个RMI客户端测试,如果RMI服务器正在运行并且可以访问.
此刻,我每隔几秒钟执行一次此测试:
try {
rMIinstance.ping();
} catch (RemoteException e) {
getInstanceRegister().removeInstance(rMIinstance);
}
(ping()是一个简单的虚拟RMI调用.)
如果实例处于脱机状态,则大约1分钟后
java.net.ConnectException: Connection timed out
异常,向我显示服务器处于脱机状态.
但是代码挂起一分钟,这对我们来说已经很长了. (我不想更改超时设置.)
有没有一种方法可以更快地执行此测试?
解决方法:
您可以从计时器中断线程.这有点hacky,并且会抛出InterruptedException而不是RemoteException,但它应该可以工作.
try {
Timer timer = new Timer(true);
TimerTask interruptTimerTask = new InterruptTimerTask(Thread.currentThread());
timer.schedule(interruptTimerTask, howLongDoYouWantToWait);
rMIinstance.ping();
timer.cancel();
} catch (RemoteException | InterruptedException e) {
getInstanceRegister().removeInstance(rMIinstance);
}
和TimerTask实现:
private static class InterruptTimerTask extends TimerTask {
private Thread thread;
public InterruptTimerTask(Thread thread) {
this.thread=thread;
}
@Override
public void run() {
thread.interrupt();
}
}