Tomcat 8.0.21中的Vaadin UI.access()

时间:2019-06-05 16:27:11

标签: java tomcat vaadin push

当我在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中工作的任何想法?

1 个答案:

答案 0 :(得分:1)

您的示例代码编写方式不起作用。如果它可以正常工作,那么它只是偶然地工作,因为其他某些事情并没有达到预期的效果。

无论您使用的是哪个Tomcat版本,ui.push()都会触发运行通过ui.access()计划的任务。您可以通过设置断点或使回调在日志中打印一些内容来确认这一点。这两个Tomat版本之间的差异很可能与ui.push()在直接在点击处理程序中直接运行时的行为方式有关。

ui.push()应该从在后台线程中运行的ui.access()任务内部使用,以立即将所有待处理的更改发送到客户端。在这种情况下,该方法不是从后台线程调用,而是从请求线程(即点击处理程序)调用。此外,由于许多其他原因,在请求线程上休眠也有问题。

相反,您的代码结构应直接将微调框设置为可见,然后安排线程或计时器以完成其余工作,最后从单击处理程序急切地返回。然后线程或计时器应使用ui.access()隐藏微调框。只要您使用默认的“自动”推送模式而不是ui.push(),就不需要使用PushMode.MANUAL