当我在Tomcat 8.0.52中部署应用程序时,以下代码可以按预期工作:
button.addClickHandler(() -> {
UI ui = UI.getCurrent();
ui.access(() -> {
spinner.setVisible(true);
});
ui.push();
try
{
Thread.sleep(5000);
}
catch (InterruptedException e)
{
LOG.error("", e)
}
spinner.setVisible(false);
});
赋予Runnable
的{{1}}显示了一个微调框,在5秒钟后,该微调框被隐藏了。
当我在Tomcat 8.0.21中部署应用程序时,由于未显示微调器,所以未执行ui.access()
。
我的UI带有Runnable
Push在Tomcat的两个版本中都能正常工作,问题出在@Push(value = PushMode.MANUAL, transport = Transport.WEBSOCKET_XHR)
的{{1}}方法上。
关于access()
为什么不能在Tomcat 8.0.21中工作的任何想法?
答案 0 :(得分:1)
您的示例代码编写方式不起作用。如果它可以正常工作,那么它只是偶然地工作,因为其他某些事情并没有达到预期的效果。
无论您使用的是哪个Tomcat版本,ui.push()
都会触发运行通过ui.access()
计划的任务。您可以通过设置断点或使回调在日志中打印一些内容来确认这一点。这两个Tomat版本之间的差异很可能与ui.push()
在直接在点击处理程序中直接运行时的行为方式有关。
ui.push()
应该从在后台线程中运行的ui.access()
任务内部使用,以立即将所有待处理的更改发送到客户端。在这种情况下,该方法不是从后台线程调用,而是从请求线程(即点击处理程序)调用。此外,由于许多其他原因,在请求线程上休眠也有问题。
相反,您的代码结构应直接将微调框设置为可见,然后安排线程或计时器以完成其余工作,最后从单击处理程序急切地返回。然后线程或计时器应使用ui.access()
隐藏微调框。只要您使用默认的“自动”推送模式而不是ui.push()
,就不需要使用PushMode.MANUAL
。