GWT生产崩溃



我正在开发一个GWT-GAE Java交易应用程序,客户在其中下订单,然后在服务器上处理,然后通知客户(通过AppEngine Channel)更新。我的问题是,我得到不规则的客户端崩溃- 5~10分钟的交易后,客户端可能崩溃(在Chrome我看到这个页面:Chrome://crash/)。我已经在生产环境中测试了这一点,有多达10个同时交易的交易员(在不同的机器上)交易30分钟,我通常会有4到5个独立的客户端崩溃。如果连接更少,或者交易活动更少,我认为不会出现崩盘。

我认为问题可能是ConcurrentModificationExceptions,所以我尝试1)使用Scheduler.get()延迟命令。scheduleDeferred和2)实现消息队列,但这两个似乎都没有帮助。

我的问题是-我如何调试这个?在开发过程中,在出现内存错误之前,我可以同时建立的连接数量有限(2或3个),因此我无法重复我的问题。是否有一种方法可以查看在生产环境中抛出的导致这些崩溃的异常类型?

我看了看GWT日志机制——我能记录服务器上的选项卡崩溃吗?

谢谢!

更新

我已经设置了gwt-log,但是当我重现我的客户端崩溃时,它似乎没有记录它。它记录各种其他信息,但当客户端崩溃时没有错误。在客户机上,我有一个围绕通道消息的try-catch:

try {
  SerializationStreamReader reader = ((SerializationStreamFactory)rpcService).createStreamReader(encodedData);
  Message message = (Message) reader.readObject();
  Log.info(name + ": " + message.toString());
  processMessage(message);
} catch (Exception e) {
  Log.fatal(name + ": error encoding " + encodedData);
}
当客户端崩溃时,我应该在服务器日志中看到一些东西吗?

使用dev-mode,您很快就会遇到大型应用程序或使用大量jsni的应用程序的内存和性能问题。这是由于开发模式的架构需要IDE和浏览器插件之间复杂的通信过程,以及JVM和JS之间频繁的执行上下文切换。

要调试复杂的东西,最好使用super-dev模式,它只会在你的浏览器中执行javascript,并提供了一个很好的方法(源代码映射)来调试你的浏览器中的应用程序,但使用你的java源代码。

注意,超级开发模式的设置有点复杂,特别是当您需要与后端通信时,重新加载过程有点慢,并且要注意您将错过IDE java调试控制台。但值得一试。

可以使用Remote_Logging

还有https://code.google.com/p/gwt-log/

给了你更多的选项,比如

  • 自定义url

    https://code.google.com/p/gwt-log/wiki/GettingStarted Override_the_default_URL_which_the_RemoteLogger_connects_to

  • 格式

    https://code.google.com/p/gwt-log/wiki/GettingStarted Server_side_log_messages

    -------------- 编辑 --------------

    是否尝试了UncaughtExceptionHandler?

    //安装UncaughtExceptionHandler生成FATAL日志消息

    Log.setUncaughtExceptionHandler();
    

最新更新