是否可以使用Vaadin + Tomcat webapp连续运行线程?

时间:2014-09-02 12:51:16

标签: java web-services rest tomcat vaadin

我正在尝试使用Vaadin前端构建一个webapp,它允许用户上传和处理我们服务器上的数据。这个过程非常复杂,是一个多线程的应用程序(让我们称之为“核心”#39;)。在设计这个应用程序时,我认为我可以将所有内容都粘贴到tomcat服务器上,但是我的同事告诉我,本地,Vaadin是RESTful,因此不会持续运行业务流程,因为应用程序是无状态的。他声称tomcat JVM在运行请求后只会进入休眠状态,而不是完成线程进程。因此,他建议我使用RMI将数据发送到同一服务器上的另一个进程,并在那里处理它。

我对此有几个问题:

  1. 他所声称的一切都是真的吗?在Tomcat上实现Vaadin的一些复杂性是我不知道的?
  2. 我更有可能认为我误解了他,他实际上在解释为什么分离演示文稿和业务组件(我完全赞同)更好。但从纯粹的理论角度来看,是否有可能将多线程核心与运行Vaadin的tomcat服务器实例挂在同一个tomcat服务器实例上?

2 个答案:

答案 0 :(得分:2)

据我所知,Vaadin不使用REST服务进行客户端 - 服务器通信。它是有状态的并且使用某种支持bean。

关于线程问题,如果直接从Vaadin组件调用长时间运行的任务,它将阻止处理请求的线程,直到任务完成。从浏览器的角度来看,您必须等待并看到旋转指示器,直到进程完成(或由于请求超时而引发异常)。

您可以做的是在单独的线程中运行长时间运行的任务。如果您希望新线程在同一JVM上运行,则不需要像RMI这样的东西。 您可以通过以下任一方式完成:

请注意,您可能必须实现某种通知机制才能知道线程何时完成任务。

答案 1 :(得分:1)

您可以根据需要从tomcat启动单独的线程。 你有什么前端并不重要。

但是,当您希望从另一个线程更新它们时,以正确的方式访问vaadin UI组件非常重要。

对于vaadin 7,这已得到极大增强,允许服务器开箱即用。 在vaadin 6中,你必须为此使用一些工作。

https://vaadin.com/book/-/page/advanced.push.html#advanced.push.running

我们将这个概念用于出口和报告生成。 - 使用点击导出/报告 - 在服务器上,我们启动一个(低优先级)线程来构建报告/导出 - 在此期间,我们通过服务器推送更新客户端上的进度条 - 一旦线程生成了导出/报告,我们就将其发送到webbrowser

如果您希望核心始终运行并接受"工作"那么也许你会更喜欢像石英或类似的工作。