java - 如果远程调用传播错误,如何让 Spring 致命退出

标签 java spring exception rmi

我有一个通过 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/

相关文章:

java - 无法在android中实现描述符

java - = java中的运算符

java - 尽管默认情况下应该启用异步支持,但未启用异步支持

python - (单元)测试python信号处理程序

node.js - NodeJs http状态异常处理

java - 如何实现网页应用的屏幕共享?

java - jhat 抛出无法识别的魔数(Magic Number)

spring - 如何将Spring Boot与Elasticsearch 7.3连接

java - "Hello World"使用 Spring MVC 的 SOAP Web 服务

使用 Dire 进行异常处理