【问题标题】:Can a Vaadin+Tomcat webapp be used to run a thread continuously?可以使用 Vaadin+Tomcat webapp 连续运行线程吗?
【发布时间】:2014-09-02 12:51:16
【问题描述】:

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

我对此有几个问题:

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

【问题讨论】:

    标签: java web-services rest tomcat vaadin


    【解决方案1】:

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

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

    您可以做的是在单独的线程中运行长时间运行的任务。如果您希望新线程在同一个 JVM 上运行,则不需要 RMI 之类的东西。 你可以这样做:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

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

      如果您希望核心始终运行并接受“工作”,那么也许使用石英或类似的工作调度器会更好。

      【讨论】:

        猜你喜欢
        • 2017-06-11
        • 1970-01-01
        • 1970-01-01
        • 2021-10-02
        • 1970-01-01
        • 2016-09-02
        • 2022-06-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多