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 不支持此插件,应改用超级开发模式。
在执行 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 不支持此插件,应改用超级开发模式。