vaadin推动不在标签上工作

时间:2013-12-02 19:31:18

标签: multithreading vaadin

我有一个异步线程运行,它定期检查数据库是否发生插入。找到记录后,将加载UI。

当加载大量数据并发生重大UI更改时,UI.push()方法可以正常工作。 我遇到问题,是将Label.setValue()更改回客户端。

标签更新的代码是:

Label displayProgress;

...

private void updateProgress(final int status) {
    CustomUI.getInstance().access(new Runnable() {
        @Override
        public void run() {
            LOG.log(Level.INFO, "Running progress text update");
            StringBuilder sb = new StringBuilder(100);

            String desc = StateManager.getDescription(status);
            Integer step = StateManager.getStatusIndex(status);

            sb.append("Step ").append(step).append(" of ").append(StateManager.getStatusCount());
            sb.append("\n").append(desc);

            displayProgress.setValue(sb.toString());
            //displayProgress.markAsDirty();

            LOG.log(Level.INFO, sb.insert(0, "Progress text should be: ").toString());

            CustomUI.getInstance().push();
        }
    });
}

我的CustomUI类添加了以下注释:

@Push(value = PushMode.MANUAL, transport = Transport.STREAMING)

此代码在异步线程内调用~10秒。日志记录显示了我期望的正确输出,但标签将永远不会显示。如果工作正常,标签可供客户查看。

我尝试过的其他实现,没有成功:

  • 使用UI.setPollInterval(10000)
  • 推送STREAMING和WEBSOCKET的传输值
  • 其他可展示组件取代Label
  • 手动将显示组件标记为脏
  • Component.Immediate值true和false

我使用的服务器是带有JVM 1.6的Apache Tomcat / 7.0.42。我无法更改或更新服务器上的任何内容,因此我仅限于修改应用程序设置和项目文件以解决此问题。希望其他人已经解决了这个问题,可以帮助我。

谢谢

1 个答案:

答案 0 :(得分:1)

我终于找到了解决这个问题的方法。

调用Label.markAsDirty()确实有效......假设您使用的是Vaadin 7.1.1+。如果仍然使用Vaadin 7.1.0(我是),你需要先锁定会话,否则你将失败Label.markAsDirty()方法中的断言。

VaadinSession.getCurrent().lock();
Label.markAsDirty();
VaadinSession.getCurrent().unlock();