2014-09-02 74 views
0

我正在尝试使用Vaadin前端构建一个Web应用程序,该应用程序允许用户在我们的服务器上上传和处理数据。这个过程相当复杂,并且是一个多线程应用程序(我们称之为'核心')。在设计这个应用程序时,我认为我可以将所有东西都放在tomcat服务器上,但我的一位同事告诉我,在本地,Vaadin是RESTful的,因此不会持续运行业务流程,因为应用程序是无状态的。他声称,tomcat JVM将在运行请求之后进入休眠状态,而不是完成线程进程。因此,他建议我使用RMI将数据发送到同一台服务器上的另一个进程,并在那里处理它。可以使用Vaadin + Tomcat webapp连续运行线程吗?

我有这几个问题:

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

回答

2

据我所知不同,Vaadin不适用于客户机 - 服务器通信使用REST服务。它是有状态的,并使用某种辅助豆类。

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

你可以做的是在单独的线程中运行长时间运行的任务。如果你想让新的线程在同一个JVM上运行,你不需要像RMI那样的东西。 您可以通过做到这一点:

请注意,你可能不得不实行某种形式的通知机制,知道什么时候该线程已完成任务。

1

您可以从Tomcat作为需要启动单独的线程。 无论你有什么前端,这都没关系。

但重要的是,当你想从另一个线程更新它们访问vaadin UI组件的正确方法。

对于vaadin 7这已被大大增强,以允许服务器推送开箱。 在vaadin 6中,您必须为此使用一些工作环节。

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

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

如果你想有一个核心始终运行并接受“工作”,那么也许你更好地工作sheduler如石英或类似的服务。