我正在尝试使用Vaadin前端构建一个webapp,它允许用户上传和处理我们服务器上的数据。这个过程非常复杂,是一个多线程的应用程序(让我们称之为“核心”#39;)。在设计这个应用程序时,我认为我可以将所有内容都粘贴到tomcat服务器上,但是我的同事告诉我,本地,Vaadin是RESTful,因此不会持续运行业务流程,因为应用程序是无状态的。他声称tomcat JVM在运行请求后只会进入休眠状态,而不是完成线程进程。因此,他建议我使用RMI将数据发送到同一服务器上的另一个进程,并在那里处理它。
我对此有几个问题:
答案 0 :(得分:2)
据我所知,Vaadin不使用REST服务进行客户端 - 服务器通信。它是有状态的并且使用某种支持bean。
关于线程问题,如果直接从Vaadin组件调用长时间运行的任务,它将阻止处理请求的线程,直到任务完成。从浏览器的角度来看,您必须等待并看到旋转指示器,直到进程完成(或由于请求超时而引发异常)。
您可以做的是在单独的线程中运行长时间运行的任务。如果您希望新线程在同一JVM上运行,则不需要像RMI这样的东西。 您可以通过以下任一方式完成:
ExecutorService
(例如:Executors.newSingleThreadExecutor()
)并将任务提交到请注意,您可能必须实现某种通知机制才能知道线程何时完成任务。
答案 1 :(得分:1)
您可以根据需要从tomcat启动单独的线程。 你有什么前端并不重要。
但是,当您希望从另一个线程更新它们时,以正确的方式访问vaadin UI组件非常重要。
对于vaadin 7,这已得到极大增强,允许服务器开箱即用。 在vaadin 6中,你必须为此使用一些工作。
https://vaadin.com/book/-/page/advanced.push.html#advanced.push.running
我们将这个概念用于出口和报告生成。 - 使用点击导出/报告 - 在服务器上,我们启动一个(低优先级)线程来构建报告/导出 - 在此期间,我们通过服务器推送更新客户端上的进度条 - 一旦线程生成了导出/报告,我们就将其发送到webbrowser
如果您希望核心始终运行并接受"工作"那么也许你会更喜欢像石英或类似的工作。