Java Vaadin Web应用程序,后端计算量大

Java Vaadin Web应用程序,后端计算量大,java,akka,vaadin7,Java,Akka,Vaadin7,我开发了一个java应用程序,它分析来自数据库的大量数据,这会导致相当长的计算时间,并生成我用图表库可视化的cvs文件 因此,为了避免在用户输入的java swing界面和浏览器中的可视化界面之间切换,我决定开发一个Vaadin应用程序,该应用程序使用现有代码作为后端,并提供输入和可视化界面 由于这是我第一次与Vaadin合作,我试图弄清楚我尝试做的事情中有多少是可行的,特别是因为耗时的计算肯定会产生会话超时 如果我使用轮询,那么考虑到许多用户可能同时使用午餐计算,服务器上的工作量会不会太大 我

我开发了一个java应用程序,它分析来自数据库的大量数据,这会导致相当长的计算时间,并生成我用图表库可视化的cvs文件

因此,为了避免在用户输入的java swing界面和浏览器中的可视化界面之间切换,我决定开发一个Vaadin应用程序,该应用程序使用现有代码作为后端,并提供输入和可视化界面

由于这是我第一次与Vaadin合作,我试图弄清楚我尝试做的事情中有多少是可行的,特别是因为耗时的计算肯定会产生会话超时

如果我使用轮询,那么考虑到许多用户可能同时使用午餐计算,服务器上的工作量会不会太大


我应该提到的另一件事是,我在现有应用程序中使用actors,有没有一种方法可以将它用于类似推送的行为,以便在工作完成时发送通知?

是的,您的项目可能非常适合应用程序

可伸缩性 可伸缩性可能是Vaadin的一个问题,因为您的整个应用程序都位于服务器上,而客户端上只有UI小部件的表示。所有业务逻辑和数据结构都位于服务器上,而不是客户端。因此,Vaadin应用程序可能会消耗服务器上的内存和CPU使用量

尽可能在服务器上缓存结果,并在用户会话之间共享数据。大多数UI小部件都不能共享,因为它们的状态是每个用户都会更改的。但您可以共享您的支持数据

请参阅这两篇关于Vaadin中可伸缩性的参考资料。瓦丁当然可以扩大规模。Vaadin公司已经对11000名客户同时进行了模拟。见:

  • (公司博客帖子)
  • 阿伦·古普塔(视频演示,YouTube)
P>参见类似的问题,讨论何时考虑VAdIn。< /P> 穿线 线程可能非常有用

Java现在提供了一些强大但简单的线程支持。如果您可以在一段时间内执行计算块,那么就在线程上执行

Vaadin内置了从后台线程更新用户界面的支持,类似于Swing。对象(浏览器窗口/选项卡中的所有内容)提供了调度可运行更新小部件的方法。大概是这样的:

getUI().access(
    new Runnable() {
        @Override
        public void run() {
            // Update widgets here. 
            // Change Label text, TextField contents, and so on.
            // Show results of your computation (interim or final).
        }
    }
);  // Or use Lambda syntax in Java 8.
您肯定希望避免在用户的UI线程中进行那些长时间的计算。至少,它会锁定用户界面,导致用户沮丧,并可能认为应用程序已经崩溃。在最坏的情况下,会话可能会像您提到的那样超时。与Swing一样,解决方案是在后台线程上完成繁忙的工作,然后安排在用户界面上完成更新

纺车 如果在计算完成之前,你的应用程序没有其他用处,那么你可以显示一个旋转轮指示器。在“不确定”模式下使用小部件。请参阅,单击齿轮图标以检查“样本”选项卡上的“不确定”模式。使用“主题”选项卡查看Valo和驯鹿主题的每个不同轮子样式

如果可以将计算进度量化为介于0.0f和1.0f之间的数字,则可以使用禁用“不确定”属性的进度条

推 在Vaadin 7中,使用线程进行后台处理比以往任何时候都容易。现在内置于瓦丁

见《瓦丁书》

如果没有推送,用户界面的更新只会在用户点击按钮等操作后发送到浏览器(除非你耍了一些花招)

在vaadin7中,只需将
@Push
注释添加到主类中。然后,绑定的库接管。Atmosphere负责自动尝试连接以交付更新。如果WebSockets不可用,则会采用轮询等其他方法

Atmosphere是一个非常成功的项目,用于许多产品。因此,在大多数情况下,它工作得非常好。请注意,Push,尤其是WebSocket是一项相对较新的技术,在规格、实现、服务器和浏览器方面都有很多变化。这条新路可能会有些颠簸

Push的工作示例 我已经提供了两个使用Push和Vaadin的完整示例项目的源代码。看一个简单的例子。请参阅此以了解更多深度

投票 关于你的具体问题:

如果我使用轮询,考虑到许多用户可能同时启动计算,服务器上的工作量会不会太大

在中国,网络上一直在使用各种各样的工具。我想象你现在正在看到它(如果使用web浏览器),StackOverflow更新你的“最近收件箱消息”和“最近成就”标记在本页顶部

根据定义,轮询是低效的。浏览器将对服务器进行调用,但如果服务器上还没有生成新数据,这些调用通常是徒劳的。而且建立连接的成本相对较高

但管理费用和开支并不是无谓的。投票是有效的,可能每天在互联网上进行数十亿次

到达后,这些呼叫将以更少的开销变得更高效

最佳解决方案是服务器在新数据准备就绪时通知客户端。这就是WebSocket技术存在的理由,浏览器和服务器保持开放的实时网络连接,以允许在任何时候进行双向通信。如上所述,Atmosphere库会自动尝试WebSocket,并在需要时返回轮询

所以,对您的问题的答案是“不,服务器的工作量不太大”。轮询是一种实用的解决方案,常用于使web客户端保持服务器端事件的最新状态

更新用户界面 我对演员不在行


更新: