【问题标题】:Vaadin UI.access() in Tomcat 8.0.21Tomcat 8.0.21 中的 Vaadin UI.access()
【发布时间】:2019-10-21 04:51:25
【问题描述】:

当我在 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);
});

ui.access()Runnable 显示一个微调器,5 秒后该微调器被隐藏。

当我在 Tomcat 8.0.21 中部署应用程序时,Runnable 未执行,因为未显示微调器。

我的 UI 带有 @Push(value = PushMode.MANUAL, transport = Transport.WEBSOCKET_XHR) 注释

Push 在两个 Tomcat 版本中都可以正常工作,问题出在 UIaccess() 方法上。

知道为什么ui.access() 在 Tomcat 8.0.21 中不起作用吗?

【问题讨论】:

  • 在 clickhandler 中你不需要ui.access 代码,因为这已经由框架完成了。您需要创建一个单独的线程,然后将这些内容与 clickHandler 方法异步。

标签: java tomcat vaadin push


【解决方案1】:

您的示例代码的编写方式不应该工作。如果它起作用了,那么它只是偶然起作用,因为其他东西没有按预期运行。

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

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

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

【讨论】:

  • 我误解了ui.access() 方法。我认为它会创建一个新线程来访问 UI。
猜你喜欢
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-29
  • 1970-01-01
  • 2017-06-09
相关资源
最近更新 更多