繁体   English   中英

GWT服务异常日志记录的最佳实践

[英]Best Practices for GWT services exceptions logging

我决定将日志系统添加到我的gwt服务层。 首先,我想记录从该层抛出的所有异常。 我有一个类似于Spring的ServletDispatcher的对象,它调用其他服务。 我以为我可以在那里添加日志记录,但我意识到GWT服务将ServletResponse中的已检查异常包装起来并取消选中UnexpectedException。

任何人都可以分享他对这个问题的经验吗? 记录所有GWT服务的已检查和未检查异常的最佳方法是什么。


我找到了建议扩展RemoteServiceServlet并覆盖默认异常流的解决方案。 但我发现这个解决方案太费时间了。 anybode知道任何更简单的变体吗?

在服务器端,我们有一个RemoteServiceServlet的子类,我们将其用于所有服务实现。 你提到它似乎很耗时,但这就是代码的样子。 你做了一次而且你已经完成了。

@Override
protected void doUnexpectedFailure(Throwable t) {
    t.printStackTrace(System.err);
    super.doUnexpectedFailure(t);
}

注意:我们实际上并没有将它发送到System.err,你可能也不应该,但是你明白了。

在客户端,我们使用AsyncCallback的子类AsyncSuccessCallback。 它为大多数RPC调用统一处理onFailure情况。 我们的大部分回调代码都可以处理onSuccess案例,知道onFailure已被处理。 它还提供了一个稍后更改此实现的位置。

public abstract class AsyncSuccessCallback<T> implements AsyncCallback<T> {

    public void onFailure(Throwable t) {
        handleException(t);
    }

    protected void handleException(Throwable t) {
         Window.alert(t.getMessage());
    }

}

注意:我们实际上并没有使用Window.alert,但是再一次,你明白了。 我们在这种情况下所做的是显示一个GWT DialogBox,它显示一个表单,该表单对接受错误报告的其他服务器执行POST。 该表单允许用户键入错误发生时他们正在做的事情的描述。

在客户端,如果要获取堆栈跟踪,则需要编写一些额外的代码:

// for lineEnding, use "<br>" for HTML, "\n" for text
public static final String getStackTrace(Throwable t, String lineEnding) {
    Object[] stackTrace = t.getStackTrace();
    if (stackTrace != null) {
        StringBuilder output = new StringBuilder();
        for (Object line : stackTrace) {
            output.append(line);
            output.append(lineEnding);
        }
        return output.toString();
    } else {
        return "[stack unavailable]";
    }
}

您要记录哪些例外? 客户端还是服务器端? 我们有一个gwt的大型企业应用程序。 我们在客户端上使用MVP模式,并且使用通用RPCservice类完成对服务器的所有请求。 例如saveUserService = new remoteService();

在服务器端,我们处理SaveUserRequest并使用命令模式准备SaveUserResponse。 除了ClientWarningException之外,所有异常都在那里处理,它们将被传播到我们向用户显示一条好消息的客户端。

这可能有点冗长,但它在一个大约100k loc的大应用程序上得分很好。

使用gwt-dispatch 日志记录可以嵌入到标准调度服务中,如下面的示例所示,我从gwt-dispatch“ 入门”页面中提取了该示例。

public class SimpleDispatchServlet extends RemoteServiceServlet 
       implements StandardDispatchService {

    private Dispatch dispatch;

    public SimpleDispatchServlet() {
        InstanceActionHandlerRegistry registry = 
          new DefaultActionHandlerRegistry();
        registry.addHandler(new IncrementCounterHandler());
        dispatch = new SimpleDispatch(registry);
    }

    public Result execute(Action<?> action) throws DispatchException {
        try {
            return dispatch.execute(action);
        } catch (RuntimeException e) {
            log("Exception while executing " + action.getClass().getName() 
                + ": " + e.getMessage(), e );
            throw e;
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM