我想在我的应用程序中使用 Vaadin Push。我正在使用内置 vaadin push 的 vaadin 7.1.2。我有 2 个问题:
- 如何从数据库中推送数据库中数据的更改?如何收听数据库更改?vaadin push 中是否有可以使用的监听器?
- 由于我的应用程序中有许多模块,因此我只想将推送功能添加到选定的模块。是否可以仅向选定的模块添加推送?
谢谢
阿比拉什
我想在我的应用程序中使用 Vaadin Push。我正在使用内置 vaadin push 的 vaadin 7.1.2。我有 2 个问题:
谢谢
阿比拉什
Abhilash,您使用的是哪种持久层?
Common VaadinContainer
实现PropertySetChangeListener
了侦听器,因此您可以注册并接收每个 DB 更改的事件。但只有当您通过 this 更改数据库时它才会起作用Container
。
好吧,外部变化不会被注意到,也不会提供任何事件。对于这种情况,要注意这些数据库更改要困难得多。您应该实现一种“中间件”,它将处理所有数据库更改,并通知所有注册的侦听器。
对于第二个问题,我不确定您对模块的含义是什么?您能否通过示例提供更多信息?
如何从数据库中推送数据库中数据的更改?如何收听数据库更改?vaadin push 中是否有可以使用的监听器?
不,那里没有灵丹妙药。
数据库通常没有事件通知系统来提醒外部系统有关存储数据的更改。您需要自己编写此类行为。
NOTIFY
Postgres 数据库提供了一个不寻常的功能,NOTIFY
即可以从服务器端代码(例如PL/pgSQL )触发连接到数据库服务器的客户端。服务器端代码可以向客户端发送一个可选的“有效负载”字符串。必须对客户端数据库连接实现进行编码以接受此类通知。
如果你有这样的客户端,那么你可以做一些事情,比如在保存对某些表的更改时触发触发器,然后用来NOTIFY
让客户端查询作为有效负载传递的表名。
这与标准 SQL 相去甚远,并且是 Postgres 特有的功能。
如果数据库更改的唯一来源是您的 Vaadin 应用程序,您可以在您的应用程序中设置某种警报系统。
ServletContext
Servlet 规范要求它在运行时表示您的 Web 应用程序。您可以获取/设置“属性”作为各种线程和用户会话相互通信的一种方式。
您需要一种方法来跟踪所有用户会话,如此处所述。
如果您的应用程序之外的数据库有任何更改来源的机会,那么采用以 Vaadin 为中心的方法可能不切实际。
有关当前 Vaadin 用户之间消息传递的更多信息,请参阅 Vaadin 文档中的向其他用户广播部分,如对类似问题的回答中所述。
一种常见的解决方案是轮询。产生一个后台线程来查询数据库,报告结果,然后休眠。起泡,冲洗,重复。将睡眠时间设置为用户愿意过时的时间。
ScheduledExecutorService
内置 Java SE使此类工作变得更加容易。或者,Java EE 提供了此处讨论@Schedule
的注释,但我不熟悉它的用法。无论哪种方式,您都在安排一段代码重复运行。顺便说一句,永远不要在基于 Servlet 的应用程序或 Java EE 应用程序中使用该类。Timer
我已ScheduledExecutorService
在 Tomcat 8.5 中运行的 Vaadin 7 应用程序中成功使用。了解ServletContextListener
作为应用程序中启动和关闭执行程序服务的位置。请参阅我的幻灯片,了解我关于该主题的演讲。
并确保永远不要从后台线程访问 Vaadin 用户界面布局和小部件。相反,始终通过调用 access
或accessSynchronously
在UI
类上与用户界面相关的更改VaadinSession
或非用户界面相关的更改来与 UI 交互。阅读Vaadin 文档中服务器推送页面的从另一个线程访问 UI部分。
推送技术一直是一个快速发展的领域。
我记得,使用 Push 的 Vaadin 8 可能比 Vaadin 7 更有效,尽管我不记得细节了。至少,Vaadin 8 可能正在使用支持 Vaadin Push 功能的Atmosphere库的更新版本。因此,如果可能,您可能需要考虑迁移到 Vaadin 8。请记住,Vaadin 8 具有兼容层功能,可让您更轻松地引入 Vaadin 7 代码。
最重要的是,一定要使用最新版本的Web 容器,例如 Tomcat 或 Jetty。特别是对WebSocket的支持多年来有了显着的改进。
虽然在实践中可能还没有准备好,但Servlet 4 规范对 Push 技术的未来具有重大影响。该规范包括对HTTP/2和请求/响应多路复用的支持,以帮助进行服务器端推送。
UI
由于我的应用程序中有许多模块,因此我只想将推送功能添加到选定的模块。是否可以仅向选定的模块添加推送?
启用 Push 会显着改变您的部署情况,因此您明智地仔细考虑它的使用。
Vaadin 对 Push 的支持仅限于您的UI
. 默认情况下,您的 Vaadin 应用程序UI
为每个用户提供一个对象,来自类的单个子UI
类。UI
但是您可以在用户会话中自由地实例化其他对象。这些实例可能来自您的同一个子类,也可能来自您编写 UI
的其他子类。UI
这正是多窗口/多选项卡支持在 Vaadin 7 和 Vaadin 8 中的工作方式:您实例化一个新的UI
子类对象并将其安装到新的 Web 浏览器窗口或选项卡中。
我不确定,但您可以在同一个 Web 浏览器窗口/选项卡中将启用推送的对象换成UI
替代的非推送启用对象。UI
但是我没有尝试过这样做,我不知道是否支持或推荐这样做。就个人而言,我会选择UI
在窗口/选项卡的整个生命周期中安装相同的对象。