我正在尝试构建一个带有 Vaadin 前端的网络应用程序,它允许用户在我们的服务器上上传和处理数据。该过程非常复杂,并且是一个多线程应用程序(我们称其为“核心”)。在设计这个应用程序时,我认为我可以将所有东西都放在 tomcat 服务器上,但我的一位同事告诉我,Vaadin 本身是 RESTful,因此不会连续运行业务流程,因为该应用程序是无状态的。他声称tomcat JVM在运行请求后会简单地进入 hibernate 状态,不会完成线程进程。因此,他建议我使用 RMI 将数据发送到同一台服务器上的另一个进程,然后在那里进行处理。
我有几个问题:
- 他所说的都是真的吗?有一些我不知道的在 Tomcat 上实现 Vaadin 的复杂性?
- 更有可能我认为我误解了他,他实际上是在解释为什么最好将表示和业务组件分开(我完全同意)。但是从纯理论的角度来看,是否有可能将多线程核心与运行 Vaadin 的服务器实例粘贴到同一个 tomcat 服务器实例上?
最佳答案
据我所知,Vaadin 不使用 REST 服务进行客户端-服务器通信。它是有状态的并使用某种支持 bean。
关于您的线程问题,如果您直接从 Vaadin 组件调用长时间运行的任务,它将阻止线程处理您的请求,直到任务完成。从浏览器的角度来看,您必须等待并看到旋转指示器,直到该过程完成(或由于请求超时而引发异常)。
您可以做的是在单独的线程中运行长时间运行的任务。如果你想让新线程运行在同一个 JVM 上,你不需要像 RMI 这样的东西。 您可以通过以下任一方式完成:
- 使用
ExecutorService
(例如:Executors.newSingleThreadExecutor()
)并将任务提交到 - 创建一个新线程并启动它
- 做类似的事情:https://vaadin.com/forum/#!/thread/2008536/2010911
请注意,您可能必须实现某种通知机制才能知道线程何时完成任务。
关于java - Vaadin + Tomcat webapp 可以用来连续运行一个线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25623875/