GWT 代码卡在 reactToMessages 上

GWT code stuck on reactToMessages

在执行 GWT UI 时,执行卡在内部的无限循环中 下面的代码:

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:
        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);

}

我正在使用 GWT 2.7.0,但我已经尝试过更改为旧版本,但是没有成功。

该循环是遗留 "Dev Mode" 的一部分(已被 "Super Dev Mode" 取代):您浏览器中的插件可以连接到此 JVM 并通过将消息传递到此循环来进行通信。流量控制通过抛出异常来管理,表示浏览器已经断开连接。

这个循环不是问题 - 每次通过循环都意味着浏览器已成功调用 JVM 到 Java 中 GWT 应用程序的 运行 部分,然后 Java 将控制权返回给浏览器,因此它应该等待 JS 对 Java 的下一次调用。简而言之,如果您看到这段代码正在执行,则不会卡住,只有开发模式服务器正在等待执行某些操作。

在任何编译为 JS 的生产 GWT 中,这将根本不存在 - 控制保留在浏览器中,因为所有 Java 都编译为 JS,因此不需要任何浏览器插件管理。

最近的 Firefox 或 Chrome 不支持此插件,应改用超级开发模式。