由于内部无限循环,GWT应用程序冻结

时间:2014-01-15 21:14:07

标签: java gwt infinite-loop gxt gwt-2.5

我在Eclipse Juno上使用GWT 2.5.1和Ext GWT v2.2.4运行GWT应用程序。 Java 6(32位),我不能改变任何这一点。

我最近交给了这个在另一台机器上工作正常的应用程序。启动应用程序(运行> GWT应用程序)后,我继续登录我的应用程序,我的代码正常执行但我的应用程序冻结。我调试并发现应用程序在此GWT内部方法中进入无限循环(即在类com.google.gwt.dev.shell.BrowserChannelServer中):

public void reactToMessages(SessionHandlerServer handler) {
    do {
      try {
        getStreamToOtherSide().flush();
        MessageType messageType = Message.readMessageType(
            getStreamFromOtherSide());
        switch (messageType) {
          case FREE_VALUE:
            final FreeMessage freeMsg = FreeMessage.receive(this);
            handler.freeValue(this, freeMsg.getIds());
            break;
          case INVOKE: //<<<< Keeps getting into this block
            InvokeOnServerMessage imsg = InvokeOnServerMessage.receive(this);
            ExceptionOrReturnValue result = handler.invoke(this, imsg.getThis(),
                imsg.getMethodDispatchId(), imsg.getArgs());
            sendFreedValues();
            ReturnMessage.send(this, result);
            break;
          case INVOKE_SPECIAL:
            handleInvokeSpecial(handler);
            break;
          case QUIT:
            return;
          default:
            throw new RemoteDeathError(new BrowserChannelException(
                "Invalid message type " + messageType));
        }
      } catch (IOException e) {
        throw new RemoteDeathError(e);
      } catch (BrowserChannelException e) {
        throw new RemoteDeathError(e);
      }
    } while (true);
}

messageType始终为 INVOKE ,由于while条件为 true ,因此循环永远不会结束。所以执行被困在这个堆栈中:

Daemon Thread [Code server for av.mymodule from Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0 on http://127.0.0.1:8889/mymodule.html?gwt.codesvr=127.0.0.1:9997 @ tsb2t8vtLUT/vrj#] (Suspended)
            BrowserChannelServer.reactToMessages(BrowserChannelServer$SessionHandlerServer) line: 292      
            BrowserChannelServer.processConnection() line: 547  
            BrowserChannelServer.run() line: 364  
            Thread.run() line: 662  

我清理了项目,删除了缓存文件,tmp文件,重新编译了很多次,尝试了旧版本2.4.0,但我无法尝试2.6因为我需要java 7,我现在无法安装。我试过chrome和firefox,结果相同。经过一些搜索后,我发现了一些我不应该使用浏览器放大的建议,但我并没有这样做。

请问有什么问题?

2 个答案:

答案 0 :(得分:1)

问题是Ext GWT 2.2.4与GWT 2.5.1不兼容,但它与GWT 2.5.0兼容

所以改用GWT 2.5.0解决了这个问题。

答案 1 :(得分:0)

我认为您的 while 条件应该是动态变量而不是 true 。你应该打破 do while循环。如果没有,您的执行可能会堆叠。

public class TestDoWhile {
private static TestDoWhile test;

public static void main(final String[] args) {
    test = new TestDoWhile();
    test.invokeMethod(2);
    test.invokeMethod(1);
}
public final void invokeMethod(final int testCase) {
    do {
        switch (testCase) {
        case 1:
            System.out.println("Invoke");
            break;
        case 2:
            System.out.println("Please , let me quit !");
            return;
        default:
            return;
        }
    } while (true);
}
}

我的java程序的结果是什么?那可能堆叠。我无法想象你的这两种方法             的 sendFreedValues();             ReturnMessage.send(this,result);

  

因此,添加返回而不是中断。有一些对你有用。