测试环境: IDEA + JETTY + HPROSE
若要获取接口异常通知(回调)
需调用ServletHolder的setInitParameter方法, key为"event", 值为HproseServiceEvent
示例代码:
public class XServletHolder extends ServletHolder {
public XServletHolder(Servlet servlet) {
super(servlet);
this.setInitParameter("event", XServiceEvent.class.getName());
}
}
/**
* Created by Sid on 2016/6/22.
* 记录当前包所属代码的异常信息
*/
public class XServiceEvent implements HproseServiceEvent {
String logPrefix;
public XServiceEvent() {
logPrefix = this.getClass().getPackage().getName() + ".";
}
@Override
public void onBeforeInvoke(String s, Object[] objects, boolean b, HproseContext hproseContext) throws Throwable {
}
@Override
public void onAfterInvoke(String s, Object[] objects, boolean b, Object o, HproseContext hproseContext) throws Throwable {
}
@Override
public Throwable onSendError(Throwable throwable, HproseContext hproseContext) throws Throwable {
StringBuffer message = new StringBuffer();
StackTraceElement[] trace = throwable.getStackTrace();
message.append(throwable.toString());
for (StackTraceElement traceElement : trace) {
if (traceElement.getClassName().startsWith(logPrefix)) {
message.append("\n\tat ").append(traceElement);
}
}
Logger.getRootLogger().error(message);
return null;
}
@Override
public void onServerError(Throwable throwable, HproseContext hproseContext) {
}
}
启动时:
ServletContextHandler handler = new ServletContextHandler(ServletContextHandler.SESSIONS);
handler.setContextPath("/");
handler.addServlet(new XServletHolder(new XXX), "/XXX");
以下是作者原话:
服务器端有个HproseServiceEvent
通过实现这个接口,并进行设置,就可以记录异常了。
onSendError 是当服务器端异常转发给客户端时触发
onServerError 是服务器端无法发送数据给客户端并产生异常时触发。
在 onSendError 里面,你还可以抛出一个新的异常或者返回一个新的异常,来替换传入的异常。