具有计算重后端的 Vaadin Web 应用程序
Vaadin Web app with Computation heavy back-end
我开发了一个 java 应用程序来分析数据库中的大量数据,这会导致相当长的计算时间并生成我使用图表库可视化的 cvs 文件。
因此,为了避免在用于用户输入的 java-swing 界面和浏览器中的可视化界面之间切换,我决定开发一个 Vaadin 应用程序,该应用程序使用现有代码作为后端,并且提供输入和可视化界面。
因为这是我第一次使用 Vaadin,所以我想弄清楚我尝试做的事情有多少是可行的,特别是因为耗时的计算肯定会导致会话超时。
考虑到很多用户可能同时计算午餐,如果我使用轮询,服务器的工作量不会太大吗?
我应该提到的另一件事是我在我现有的应用程序中使用演员,有没有办法将它用于类似推送的行为以在工作完成时发送通知?
是的,您的项目可能非常适合 Vaadin 应用。
可扩展性
可伸缩性可能是 Vaadin 的一个问题,因为您的整个应用程序都在服务器上,只有 UI 小部件在客户端的表示。您所有的业务逻辑和数据结构都存在于服务器上,而不是客户端。因此,Vaadin 应用程序会耗尽服务器上的内存和 CPU 使用率。
尽可能在服务器上缓存结果,并在用户会话之间共享数据。大多数 UI 小部件无法共享,因为它们的状态会因用户而异。但是您可以共享您的支持数据。
查看这两个关于 Vaadin 可伸缩性的资源。 Vaadin当然可以扩展。 Vaadin 公司已经对 11,000 个并发客户端进行了模拟。参见:
- Vaadin Scalability Study - QuickTickets(公司博客post)
- Scaling with Vaadin and WildFly Webinar 与 Arun Gupta(视频演示,YouTube)
有关何时考虑 Vaadin 的一些讨论,请参见类似问题的 my Answer。
线程
线程可能非常有用。
Java 现在提供一些强大而简单的线程支持。如果你可以随着时间的推移执行你的计算块,那么在线程上这样做。
Vaadin 内置支持从后台线程更新用户界面,类似于 Swing 的 SwingWorker. The UI
object (all your content in a browser window/tab) offers the 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 widget in "Indeterminate" mode. See demo of Progress Bar,点击齿轮图标在"Sample"选项卡上勾选"Indeterminate"模式。使用 "Theme" 选项卡查看 Valo 和 Reindeer 主题的每种不同的车轮样式。
如果您可以将计算进度量化为 0.0f 到 1.0f 之间的数字,则可以使用进度条并关闭 "Indeterminate" 属性。
推送
在 Vaadin 7 中,使用线程进行后台处理比以往任何时候都更容易。Push technology 现在已内置到 Vaadin 中。
参见 Vaadin 之书中的 this chapter。
如果没有 Push,UI 的更新只会在用户点击按钮等操作后传送到浏览器(除非你采取了一些技巧)。
在 Vaadin 7 中,您只需将 @Push
注释添加到主 class。然后捆绑 Atmosphere library takes over. Atmosphere takes care of automatically trying WebSocket 连接来传送更新。如果 WebSockets 不可用,它会回退到其他方法,例如轮询。
Atmosphere 是一个非常成功的项目,用于许多产品。所以在大多数情况下它工作得很好。请注意,Push 尤其是 WebSocket 是相对较新的技术,在规范、实现、服务器和浏览器方面有许多变化。这条新路可能会有一些颠簸。
推送的工作示例
我已经提供了使用 Push with Vaadin 的两个完整示例项目的源代码。有关更多深度,请参阅 for a simple one. See this 。
轮询
关于您的具体问题:
If I use polling wouldn't that be too much workload on the server considering many users might launch calculations at the same time?
各种 投票 在 Push technology 中一直在网络上使用。我想您现在正在看到它(如果使用网络浏览器),因为 Whosebug 会更新您的 "Recent inbox messages" & "Recent achievments" 徽章在此页面的顶部。
根据定义,轮询效率低下。浏览器将调用服务器,这通常是徒劳的,因为服务器上还没有产生新的数据。并且 HTTP 连接的建立成本相对较高。
但是管理费用和费用并不过分。投票有效,可能每天在 Internet 上发生数十亿次。
随着 HTTP/2 的到来,这些调用将变得更加高效且开销更少。
最佳解决方案是服务器在新数据准备就绪时通知客户端。这就是WebSocket技术的存在理由,浏览器和服务器端保持实时网络连接,随时进行双向通信。正如我上面所说,Atmosphere 库会自动尝试 WebSocket 并在需要时回退到轮询。
因此,您问题的答案是 "No, not too much workload for server."。轮询是一种常用的实用解决方案,用于使 Web 客户端与服务器端事件保持同步。
正在更新UI
我不了解演员。
更新: Vaadin 8 有一个更简单的 new data model,丢弃下面显示的 Container
和 Item
构造,基本上使用利用现代 Java 语法和泛型的 POJO。
但我可以解释一下,Vaadin 带有自己的数据模型。所有 UI 小部件的背后都有一个支持数据结构。此结构建立在 Vaadin 定义的 "properties" 之上,因为 Java 缺乏其自身良好的 属性 支持。
当您修改支持数据时,小部件会自动收到通知并更新它们的显示。我假设您的演员将是更新支持数据的触发设备。
Vaadin 数据模型是 Vaadin 书中的 explained thoroughly。
多模块项目
如果您想将当前的后端项目与您的 Vaadin UI 项目分开并独立,您可以。
Vaadin 公司提供的新 Maven 原型支持多模块开发选项。因此,您可以将后端作为一个独立项目继续开发,同时将其作为另一个模块插入到您的 Vaadin 项目中。
观看由 Vaadin 团队的几个人主持的最近的 YouTube 网络研讨会 Crash Course to Official Vaadin Maven Archetypes Webinar。
在学习 Vaadin 时,我建议您从使用简单的单模块原型的一次性项目开始。除非你已经是 Maven maven,在这种情况下,就去做吧。
制图
图表的两种选择:使用 Vaadin Charts 产品或自己滚动。
Vaadin 图表
Vaadin 公司提供商业产品(需要付费),Vaadin Charts, for producing interactive nicely-rendered charts in a Vaadin app. Try the live demo。
Vaadin Charts 基本上是一个 Vaadin(纯 Java)包装器,围绕着非常成功的 JavaScript 图表库项目 HighCharts。所以 Vaadin Charts 已经过时了,而且它的图表非常先进,因为它不是全新的。
使用 Vaadin 图表意味着您可以在纯 Java 中准备所有数据,并使用纯 Java 将其打包以显示在图表中。 Vaadin 负责将数据发送给客户端。然后内置的 HighCharts 库使用用户浏览器中的 JavaScript 引擎自动在用户机器上执行图表图形的渲染。因此,您的服务器不会承担这些渲染工作。而且您没有通过网络或 Internet 传送图像。
我在自己的项目中使用 Vaadin 图表(2.1 测试版)。我强烈推荐它。
我唯一的失望是在我的图表中只允许将一个时区应用于日期时间值的限制。所有用户必须共享一个时区的时区表示。这是因为 Highcharts 实际上是在渲染图表,渲染是在 JavaScript 中构建的,而 JavaScript 对日期时间的支持很差(没有 Joda-Time 或 java.time Java脚本中的等价物)。您也许可以通过几个包含的粗略时间调整功能来绕过这个限制,但这可能会让您的大脑受伤。
Vaadin 公司提供免费试用。
您可能想观看 this webinar on YouTube Vaadin 团队的一些人与 Highcharts 公司的老板谈论他们的共同努力。
自己动手
如果您已经在生成图像或 svg 文件来表示您的图表,您可以在服务器端生成这些文件并将它们传送到您的 Vaadin 应用程序中的客户端。
如果您使用 Java脚本生成图像,您可以想象构建自己的 Vaadin 附加组件。您需要了解 GWT 和其他技术问题,因此学习曲线和工作量很大。参见 Vaadin 之书的 this chapter。基本上,您将创建与 Vaadin Charts 产品等效的产品。
我开发了一个 java 应用程序来分析数据库中的大量数据,这会导致相当长的计算时间并生成我使用图表库可视化的 cvs 文件。
因此,为了避免在用于用户输入的 java-swing 界面和浏览器中的可视化界面之间切换,我决定开发一个 Vaadin 应用程序,该应用程序使用现有代码作为后端,并且提供输入和可视化界面。
因为这是我第一次使用 Vaadin,所以我想弄清楚我尝试做的事情有多少是可行的,特别是因为耗时的计算肯定会导致会话超时。
考虑到很多用户可能同时计算午餐,如果我使用轮询,服务器的工作量不会太大吗?
我应该提到的另一件事是我在我现有的应用程序中使用演员,有没有办法将它用于类似推送的行为以在工作完成时发送通知?
是的,您的项目可能非常适合 Vaadin 应用。
可扩展性
可伸缩性可能是 Vaadin 的一个问题,因为您的整个应用程序都在服务器上,只有 UI 小部件在客户端的表示。您所有的业务逻辑和数据结构都存在于服务器上,而不是客户端。因此,Vaadin 应用程序会耗尽服务器上的内存和 CPU 使用率。
尽可能在服务器上缓存结果,并在用户会话之间共享数据。大多数 UI 小部件无法共享,因为它们的状态会因用户而异。但是您可以共享您的支持数据。
查看这两个关于 Vaadin 可伸缩性的资源。 Vaadin当然可以扩展。 Vaadin 公司已经对 11,000 个并发客户端进行了模拟。参见:
- Vaadin Scalability Study - QuickTickets(公司博客post)
- Scaling with Vaadin and WildFly Webinar 与 Arun Gupta(视频演示,YouTube)
有关何时考虑 Vaadin 的一些讨论,请参见类似问题的 my Answer。
线程
线程可能非常有用。
Java 现在提供一些强大而简单的线程支持。如果你可以随着时间的推移执行你的计算块,那么在线程上这样做。
Vaadin 内置支持从后台线程更新用户界面,类似于 Swing 的 SwingWorker. The UI
object (all your content in a browser window/tab) offers the 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 widget in "Indeterminate" mode. See demo of Progress Bar,点击齿轮图标在"Sample"选项卡上勾选"Indeterminate"模式。使用 "Theme" 选项卡查看 Valo 和 Reindeer 主题的每种不同的车轮样式。
如果您可以将计算进度量化为 0.0f 到 1.0f 之间的数字,则可以使用进度条并关闭 "Indeterminate" 属性。
推送
在 Vaadin 7 中,使用线程进行后台处理比以往任何时候都更容易。Push technology 现在已内置到 Vaadin 中。
参见 Vaadin 之书中的 this chapter。
如果没有 Push,UI 的更新只会在用户点击按钮等操作后传送到浏览器(除非你采取了一些技巧)。
在 Vaadin 7 中,您只需将 @Push
注释添加到主 class。然后捆绑 Atmosphere library takes over. Atmosphere takes care of automatically trying WebSocket 连接来传送更新。如果 WebSockets 不可用,它会回退到其他方法,例如轮询。
Atmosphere 是一个非常成功的项目,用于许多产品。所以在大多数情况下它工作得很好。请注意,Push 尤其是 WebSocket 是相对较新的技术,在规范、实现、服务器和浏览器方面有许多变化。这条新路可能会有一些颠簸。
推送的工作示例
我已经提供了使用 Push with Vaadin 的两个完整示例项目的源代码。有关更多深度,请参阅
轮询
关于您的具体问题:
If I use polling wouldn't that be too much workload on the server considering many users might launch calculations at the same time?
各种 投票 在 Push technology 中一直在网络上使用。我想您现在正在看到它(如果使用网络浏览器),因为 Whosebug 会更新您的 "Recent inbox messages" & "Recent achievments" 徽章在此页面的顶部。
根据定义,轮询效率低下。浏览器将调用服务器,这通常是徒劳的,因为服务器上还没有产生新的数据。并且 HTTP 连接的建立成本相对较高。
但是管理费用和费用并不过分。投票有效,可能每天在 Internet 上发生数十亿次。
随着 HTTP/2 的到来,这些调用将变得更加高效且开销更少。
最佳解决方案是服务器在新数据准备就绪时通知客户端。这就是WebSocket技术的存在理由,浏览器和服务器端保持实时网络连接,随时进行双向通信。正如我上面所说,Atmosphere 库会自动尝试 WebSocket 并在需要时回退到轮询。
因此,您问题的答案是 "No, not too much workload for server."。轮询是一种常用的实用解决方案,用于使 Web 客户端与服务器端事件保持同步。
正在更新UI
我不了解演员。
更新: Vaadin 8 有一个更简单的 new data model,丢弃下面显示的 Container
和 Item
构造,基本上使用利用现代 Java 语法和泛型的 POJO。
但我可以解释一下,Vaadin 带有自己的数据模型。所有 UI 小部件的背后都有一个支持数据结构。此结构建立在 Vaadin 定义的 "properties" 之上,因为 Java 缺乏其自身良好的 属性 支持。
当您修改支持数据时,小部件会自动收到通知并更新它们的显示。我假设您的演员将是更新支持数据的触发设备。
Vaadin 数据模型是 Vaadin 书中的 explained thoroughly。
多模块项目
如果您想将当前的后端项目与您的 Vaadin UI 项目分开并独立,您可以。
Vaadin 公司提供的新 Maven 原型支持多模块开发选项。因此,您可以将后端作为一个独立项目继续开发,同时将其作为另一个模块插入到您的 Vaadin 项目中。
观看由 Vaadin 团队的几个人主持的最近的 YouTube 网络研讨会 Crash Course to Official Vaadin Maven Archetypes Webinar。
在学习 Vaadin 时,我建议您从使用简单的单模块原型的一次性项目开始。除非你已经是 Maven maven,在这种情况下,就去做吧。
制图
图表的两种选择:使用 Vaadin Charts 产品或自己滚动。
Vaadin 图表
Vaadin 公司提供商业产品(需要付费),Vaadin Charts, for producing interactive nicely-rendered charts in a Vaadin app. Try the live demo。
Vaadin Charts 基本上是一个 Vaadin(纯 Java)包装器,围绕着非常成功的 JavaScript 图表库项目 HighCharts。所以 Vaadin Charts 已经过时了,而且它的图表非常先进,因为它不是全新的。
使用 Vaadin 图表意味着您可以在纯 Java 中准备所有数据,并使用纯 Java 将其打包以显示在图表中。 Vaadin 负责将数据发送给客户端。然后内置的 HighCharts 库使用用户浏览器中的 JavaScript 引擎自动在用户机器上执行图表图形的渲染。因此,您的服务器不会承担这些渲染工作。而且您没有通过网络或 Internet 传送图像。
我在自己的项目中使用 Vaadin 图表(2.1 测试版)。我强烈推荐它。
我唯一的失望是在我的图表中只允许将一个时区应用于日期时间值的限制。所有用户必须共享一个时区的时区表示。这是因为 Highcharts 实际上是在渲染图表,渲染是在 JavaScript 中构建的,而 JavaScript 对日期时间的支持很差(没有 Joda-Time 或 java.time Java脚本中的等价物)。您也许可以通过几个包含的粗略时间调整功能来绕过这个限制,但这可能会让您的大脑受伤。
Vaadin 公司提供免费试用。
您可能想观看 this webinar on YouTube Vaadin 团队的一些人与 Highcharts 公司的老板谈论他们的共同努力。
自己动手
如果您已经在生成图像或 svg 文件来表示您的图表,您可以在服务器端生成这些文件并将它们传送到您的 Vaadin 应用程序中的客户端。
如果您使用 Java脚本生成图像,您可以想象构建自己的 Vaadin 附加组件。您需要了解 GWT 和其他技术问题,因此学习曲线和工作量很大。参见 Vaadin 之书的 this chapter。基本上,您将创建与 Vaadin Charts 产品等效的产品。