如果远程调用传播错误,如何让 Spring 致命退出
我有一个通过 Spring 的 RMI 代理 机制公开服务的应用程序。存在一个问题,有时存储 JAR 的文件服务器上的“blip”会导致调用将 NoClassDefFoundError
传播回调用者。
到目前为止,还算公平。问题是,如果发生这种情况,我希望我的应用程序崩溃 - 即如果 Error
将传播回调用者。
请注意,我的应用程序中已经有一个 UncaughtExceptionHandler
,但它并未被调用(因为该异常并不是真正未捕获)
I have an application which exposes a service via Spring's RMI proxy mechanism. There is a problem whereby sometimes a "blip" on the file-server it has its JARs stored on causes an invocation to propagate a NoClassDefFoundError
back to the caller.
So far, so fair enough. The thing is, I would like my app to just crash if this happens - i.e. if an Error
is going to be propagated back out to the caller.
Note that I already have an UncaughtExceptionHandler
in the app and this is not being invoked (because the exception is not really uncaught)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您通过
RmiServiceExporter
(或RemoteExporter
的任何其他子类)公开RMI服务,那么您可以注入任意拦截器到调用堆栈,每当调用 RMI 服务时都会调用该调用堆栈。这些拦截器可以捕获任何抛出的
NoClassDefFoundError
,并调用System.exit()
。例如:
和
If you are exposing the RMI service via
RmiServiceExporter
(or any other subclass ofRemoteExporter
), then you can inject arbitrary interceptors into the call stack, which will be invoked whenever the RMI service is invoked.These interceptors could trap any thrown
NoClassDefFoundError
, and callSystem.exit()
.For example:
and
您可以做的是扩展
[RmiServiceExporter][1]
并在invoke
方法中处理异常。可以这样完成,然后在 spring 上下文中定义 rmi 服务时,您将使用 RmiServiceExporter 的 AutoFail 版本。
编辑:原始答案显示了一种在抛出异常时杀死客户端的方法。这是通过子类化 RmiProxyFactorty 并重写 doInvoke 而不是 RmiServiceExporter 来完成的。
What you can do is to extend
[RmiServiceExporter][1]
and handle the exception in theinvoke
method. This can be done as soYou would then use your AutoFail version of the RmiServiceExporterwhen defining your rmi service in your spring context.
EDIT: The original answer showed a way of killing the client when the exception is thrown. This is done by subclassing RmiProxyFactorty and overriding doInvoke instead of RmiServiceExporter.