java - Vaadin Web应用程序具有强大的后端计算能力

标签 java akka vaadin7

我已经开发了一个Java应用程序,该应用程序可以分析数据库中的大量数据,从而导致相当长的计算时间,并生成可以通过图表库进行可视化的cvs文件。

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

因为这是我第一次与Vaadin合作,所以我想弄清楚我要尝试做的事中有多少是可行的,特别是因为耗时的计算肯定会导致 session 超时。

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

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

最佳答案

是的,您的项目可能适合Vaadin应用。

可扩展性

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

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

查看有关Vaadin中的可伸缩性的这两个资源。 Vaadin当然可以扩展。 Vaadin公司已经与11,000个同时进行的客户进行了仿真。看:

  • Vaadin Scalability Study - QuickTickets(公司博客文章)
  • Arun Gupta的
  • Scaling with Vaadin and WildFly Webinar(视频演示,YouTube)

  • 有关何时考虑Vaadin的一些讨论,请参见关于类似问题的my Answer

    线程

    线程可能非常有用。

    Java现在为线程提供了一些强大而简单的支持。如果您可以随时间执行计算的大块工作,则可以在线程上执行。

    Vaadin内置支持从后台线程更新用户界面,类似于Swing的SwingWorker UI 对象(浏览器窗口/选项卡中的所有内容)提供 access 方法,用于调度Runnable更新小部件。像这样的东西:
    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线程中的冗长计算。至少,它将锁定UI,从而导致用户感到沮丧,并可能认为应用程序已崩溃。在最坏的情况下, session 可能会像您提到的那样超时。与Swing一样,解决方案是在后台线程上进行繁忙的工作,然后安排更新在用户界面上完成。

    纺车

    如果您的应用程序在计算完成之前没有其他用途,那么您可以显示一个转轮指示器。在“不确定”模式下使用Progress Bar小部件。参见demo of Progress Bar,单击齿轮图标以检查“样本”选项卡上的“不确定”模式。使用“主题”标签查看Valo和Reindeer主题的每种不同的车轮样式。

    如果您可以将计算进度量化为介于0.0f和1.0f之间的数字,则可以使用进度栏,其中“不确定”属性处于关闭状态。



    在Vaadin 7中,使用线程进行后台处理比现在更容易了。Push technology现在内置在Vaadin中。

    参见《瓦丹经》中的this chapter

    如果没有“推送”功能,则只有在用户执行操作(例如单击按钮)后,UI的更新才会传递到浏览器(除非您拉了一些花招)。

    在Vaadin 7中,您只需将@Push批注添加到您的主类中。然后, bundle 的Atmosphere库将接管。 Atmosphere会自动尝试尝试WebSocket连接来传递更新。如果WebSockets不可用,它将退回到其他方法,例如轮询。

    大气已经是一个非常成功的项目,已在许多产品中使用。因此,在大多数情况下,它的效果都很好。请注意,尽管Push(尤其是WebSocket)是相对较新的技术,但其规范,实现,服务器和浏览器都有许多更改。这条新路可能会遇到一些颠簸。

    推的工作示例

    我提供了两个使用Vaadin进行Push的示例项目的源代码。请参阅this Question中的简单说明。有关更多深度,请参见此other Question

    轮询

    关于您的具体问题:

    If I use polling wouldn't that be too much workload on the server considering many users might launch calculations at the same time?



    网路上的polling一直使用各种Push technology。我想您会在StackOverflow更新此页面顶部的“最近收件箱消息”和“最近成就”标志时(如果使用Web浏览器)看到它。

    根据定义,轮询效率很低。浏览器将调用服务器,但通常不会产生任何效果,因为服务器上尚未生成任何新数据。建立HTTP连接相对昂贵。

    但是开销和费用不是过分的。轮询可能每天在互联网上发生数十亿次。

    随着HTTP/2的到来,这些调用将以更少的开销变得更加高效。

    最佳解决方案是让服务器在准备好新数据时通知客户端。这是WebSocket技术的存在理由,浏览器和服务器可以保持实时网络连接,以便随时进行双向通信。就像我在上面说的,Atmosphere库会自动尝试WebSocket并在需要时回退到Polling。

    因此,您的问题的答案是“不,服务器的工作量不是太多”。轮询是一种常用的实用解决方案,用于使Web客户端与服务器端事件保持最新。

    更新UI

    我对 Actor 不了解。

    更新: Vaadin 8具有一个更简单的new data model,它通过利用现代Java语法和泛型放弃了以下所示的ContainerItem构造,从而基本上使用了POJO。

    但是我可以解释说Vaadin带有自己的数据模型。所有UI小部件的背后都有一个后备数据结构。该结构建立在Vaadin定义的“属性”的基础上,因为Java缺乏自身良好的属性支持。

    修改该后备数据时,将自动通知小部件并更新其显示。我假设您的 Actor 将成为更新该后备数据的触发设备。

    Vaadin数据模型在“The Book Of Vaadin”中为explained thoroughly



    多模块项目

    如果要将当前的后端项目与Vaadin UI项目分开并独立,则可以。

    Vaadin公司提供的新的Maven原型(prototype)支持多模块开发的选项。因此,您可以作为独立项目继续开发后端,但可以将其作为另一个模块插入到Vaadin项目中。

    参加Vaadin小组的几个人参加的最近一次YouTube网络研讨会Crash Course to Official Vaadin Maven Archetypes Webinar

    学习Vaadin时,建议您从使用简单的单模块原型(prototype)的一次性项目开始。除非您已经是Maven专家,否则请继续。

    制图

    有两种制图方法:使用Vaadin Charts产品或自己动手制作。

    Vaadin图表

    Vaadin公司提供了一种商业产品(需要付费)Vaadin Charts,用于在Vaadin应用程序中生成交互式的渲染效果很好的图表。尝试live demo

    Vaadin Charts基本上是一个非常成功的JavaScript图表库项目HighCharts的Vaadin(纯Java)包装器。因此,Vaadin Charts的图表制作不完善,而且非常先进,因为它不是全新的。

    使用Vaadin图表意味着您可以使用纯Java准备所有数据,并将其打包以使用纯Java在图表中显示。 Vaadin负责将数据发送给客户端。然后,内置的HighCharts库会使用用户浏览器中的JavaScript引擎在用户的计算机上自动执行图表图形的呈现。因此,您的服务器无需承担繁琐的渲染工作。而且您没有通过网络或Internet运送图像。

    我在自己的项目中使用Vaadin Charts(2.1 beta)。我强烈推荐它。

    我唯一的失望是限制只允许将单个时区应用于图表中的日期时间值。所有用户都必须共享一个时区的时区表示。这是因为Highcharts实际上是在绘制图表,该渲染是用JavaScript构建的,并且JavaScript具有糟糕的日期时间支持(JavaScript中没有Joda-Time或java.time等效项)。您可能可以使用几个附带的粗略时间调整功能来克服此限制,但是这可能会使您的大脑受伤。

    Vaadin公司提供免费试用。

    您可能希望与Vaadin团队中的一些人一起观看this webinar on YouTube,他们与Highcharts公司的老板谈论了他们的共同努力。

    自己动手

    如果您已经在生成图像或svg文件来表示图表,则可以在服务器端生成这些图像或svg文件并将其交付给客户端。

    如果使用JavaScript生成图像,则可以想到构建自己的Vaadin插件。您将需要了解GWT和其他技术问题,因此会有大量的学习过程和精力。参见《瓦丹经》的this chapter。基本上,您将创建与Vaadin Charts产品等效的产品。

    关于java - Vaadin Web应用程序具有强大的后端计算能力,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30291187/

    相关文章:

    java - 如果未在业务接口(interface)中声明,如何调用无状态 bean 方法

    java - RoboGuice wiki 过时了吗? setBaseApplicationInjector 不存在?

    java - JPAContainer通过编程方式设置关系?

    java - 在 vaadin 和 spring 下进行日志记录

    window - 如何在窗口外单击鼠标关闭 Vaadin 子窗口?

    java - 在 Netbeans 中使用 JPanels 的正确方法是什么?

    java - 在 Hibernate 程序中找不到 JDBC 驱动程序类

    java - 如何针对 Feed pull 优化 Tomcat

    scala - 如何在没有 Akka 的情况下实现 Actor 模型?

    scala - Play framework 2.0 - deadLetters 而不是 Actor