我有一个 spring 应用程序,其@PreDestroy
方法需要在关闭应用程序之前关闭某个 API 句柄,关闭句柄的方法是异步的,并且当句柄正确关闭时,API 会触发回调。
我需要调用该closeHandle(handle)
方法,然后停止程序并等待回调触发,然后恢复关闭序列。
这是我到目前为止所尝试的:
@PreDestroy
public void onDestroy() {
if (handle != null) {
try {
LogUtils.debug(getClass(), "Initializing shutdown sequence.");
closeHandle(handle);
Registry.appThread = Thread.currentThread();
Thread.currentThread().wait();
LogUtils.debug(getClass(), "Closing");
} catch (Exception e) {
LogUtils.error(getClass(), "Exception: ", e);
Thread.currentThread().interrupt();
}
}
}
这是回调:
@Override public void callback(Handle handle) {
if (Registry.appThread != null) {
Registry.appThread.notifyAll();
}
}
但是当我调用 wait() 方法时,会立即抛出这个异常:
java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
我怎样才能解决这个问题?