Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Tomcat 8.0.21中的Vaadin UI.access()_Java_Tomcat_Vaadin_Push - Fatal编程技术网

Java Tomcat 8.0.21中的Vaadin UI.access()

Java Tomcat 8.0.21中的Vaadin UI.access(),java,tomcat,vaadin,push,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

当我在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用@Pushvalue=PushMode.MANUAL、transport=transport.WEBSOCKET\u XHR注释

推送在两个Tomcat版本中都运行良好,问题在于UI的访问方法


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

你编写示例代码的方式不应该起作用。如果它起作用,那么它只会因为其他事情没有按照预期的方式运行而意外地起作用

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

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


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

在clickhandler中,您不需要ui.access代码,因为这已经由框架完成。您需要创建一个单独的线程,然后该线程将执行与clickHandler方法异步的操作。我误解了ui.access方法。我认为它会创建一个新线程来访问UI。