是的,您的项目可能非常适合 Vaadin 应用程序。
可扩展性
可伸缩性可能是 Vaadin 的一个问题,因为您的整个应用程序都存在于服务器上,而客户端上只有 UI 小部件的表示。您所有的业务逻辑和数据结构都存在于服务器上,而不是客户端上。因此,Vaadin 应用程序可能会占用服务器上的内存和 CPU 使用率。
尽可能在服务器上缓存结果,并在用户会话之间共享数据。大多数 UI 小部件无法共享,因为它们的状态会因用户而异。但是您也许可以共享您的支持数据。
看看这两个关于 Vaadin 可扩展性的资源。 Vaadin 当然可以扩展。 Vaadin 公司已经对 11,000 个同时进行的客户进行了模拟。见:
请参阅my Answer 的类似问题,了解何时考虑使用 Vaadin。
线程
线程可能非常有用。
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,导致用户感到沮丧,并可能认为应用程序已经崩溃。在最坏的情况下,会话可能会像您提到的那样超时。与 Swing 一样,解决方案是在后台线程上完成繁忙的工作,然后安排在用户界面上完成更新。
纺车
如果您的应用在计算完成之前没有其他用处,那么您可以显示一个旋转轮指示器。在“不确定”模式下使用Progress Bar 小部件。请参阅demo of Progress Bar,单击齿轮图标以检查“示例”选项卡上的“不确定”模式。使用“主题”选项卡查看 Valo 和 Reindeer 主题的每种不同车轮样式。
如果您可以将计算进度量化为 0.0f 和 1.0f 之间的数字,则可以使用关闭“不确定”属性的进度条。
推送
在 Vaadin 7 中,使用线程进行后台处理比以往任何时候都容易。Push technology 现在已内置到 Vaadin。
参见《瓦丁之书》中的this chapter。
如果没有 Push,UI 的更新只会在用户点击按钮等操作后传递给浏览器(除非你采取了一些技巧)。
在 Vaadin 7 中,您只需将 @Push 注释添加到您的主类。然后捆绑的Atmosphere 库接管。 Atmosphere 负责自动尝试WebSocket 连接以提供更新。如果 WebSockets 不可用,它会回退到其他方法,例如轮询。
Atmosphere 是一个非常成功的项目,用于许多产品。所以在大多数情况下,它工作得很好。请注意,Push 尤其是 WebSocket 是相对较新的技术,在规范、实现、服务器和浏览器方面有许多变化。这条新路可能会有一些颠簸。
推送的工作示例
我提供了两个完整的将 Push 与 Vaadin 一起使用的示例项目的源代码。一个简单的请参见this Question。请参阅此other Question 了解更多信息。
轮询
关于您的具体问题:
如果我使用轮询,考虑到许多用户可能同时启动计算,服务器上的工作量会不会太大?
各种pollingPush technology一直在网上使用。我想您现在正在看到它(如果使用 Web 浏览器),因为 StackOverflow 会在此页面顶部更新您的“最近的收件箱消息”和“最近的成就”徽章。
根据定义,轮询效率低下。浏览器将调用服务器,这通常是徒劳的,服务器上还没有产生新的数据。并且HTTP 连接的建立成本相对较高。
但开销和费用并不过分。投票有效,每天可能在互联网上发生数十亿次。
HTTP/2 到达后,这些调用将变得更高效,开销更少。
最佳解决方案是让服务器在新数据准备就绪时通知客户端。这是 WebSocket 技术的存在理由,让浏览器和服务器保持开放的实时网络连接,以便随时进行双向通信。正如我上面所说,Atmosphere 库会自动尝试 WebSocket 并在需要时回退到 Polling。
因此,您的问题的答案是“不,服务器的工作量不会太大。”。轮询是一种实用的解决方案,通常用于使 Web 客户端与服务器端事件保持同步。
更新界面
我不太了解演员。
更新: Vaadin 8 有一个更简单的new data model,丢弃了下面显示的Container 和Item 构造,基本上通过利用现代Java 语法和泛型来使用POJO。
但我可以解释说 Vaadin 带有自己的数据模型。所有 UI 小部件的背后是一个支持数据结构。这个结构建立在 Vaadin 定义的“属性”之上,因为 Java 缺乏自己良好的属性支持。
当您修改该支持数据时,小部件会自动收到通知并更新其显示。我认为您的演员将是更新该支持数据的触发设备。
Vaadin 数据模型是 The Book Of Vaadin 中的 explained thoroughly。
多模块项目
如果您想让您当前的后端项目与您的 Vaadin UI 项目分开并独立,您可以。
Vaadin 公司提供的新Maven 原型支持多模块开发选项。因此,您可以将后端作为独立项目继续开发,同时将其作为另一个模块插入到您的 Vaadin 项目中。
观看最近由 Vaadin 团队中的几个人举办的 YouTube 网络研讨会 Crash Course to Official Vaadin Maven Archetypes Webinar。
在学习 Vaadin 时,我建议您从一个使用简单单模块原型的一次性项目开始。除非您已经是 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 公司提供免费试用。
您可能想观看 this webinar on YouTube 的一些 Vaadin 团队与 Highcharts 公司的老板谈论他们的共同努力。
自己动手
如果您已经在生成图像或 svg 文件来表示您的图表,您可以在服务器端生成这些文件并将它们传送到您的 Vaadin 应用程序中的客户端。
如果您使用 JavaScript 生成图像,您可以构建自己的 Vaadin 插件。您需要了解 GWT 和其他技术问题,因此需要大量的学习曲线和努力。请参阅《Vaadin 之书》的this chapter。基本上,您将创建与 Vaadin Charts 产品等效的产品。