我有一个通过 Spring 的 RMI 代理 机制公开服务的应用程序。存在一个问题,有时存储 JAR 的文件服务器上的“blip”会导致调用将 NoClassDefFoundError
传播回调用者。
到目前为止,还算公平。问题是,如果发生这种情况,我希望我的应用程序崩溃 - 即如果错误
将被传播回调用者。
请注意,我的应用程序中已经有一个 UncaughtExceptionHandler
,但它并未被调用(因为该异常并未真正未捕获)
最佳答案
如果您通过RmiServiceExporter
(或RemoteExporter
的任何其他子类)公开RMI服务,那么您可以inject arbitrary interceptors进入调用堆栈,每当调用 RMI 服务时都会调用该调用堆栈。
这些拦截器可以捕获任何抛出的 NoClassDefFoundError
,并调用 System.exit()
。
例如:
public class ExitInterceptor implements MethodInterceptor {
@Override
public Object invoke(MethodInvocation methodInvocation) throws Throwable {
try {
return methodInvocation.proceed();
} catch (NoClassDefFoundError noClassDefFoundError) {
noClassDefFoundError.printStackTrace();
System.exit(1);
return null;
}
}
}
和
<bean id="exporter" class="org.springframework.remoting.rmi.RmiServiceExporter">
<!-- existing properties -->
<property name="interceptors">
<bean class="com.x.ExitInterceptor"/>
<property>
</bean>
关于java - 如果远程调用传播错误,如何让 Spring 致命退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3584060/