我有一个 Java EE 应用程序,它有两个组件:第一个是从 Internet 上抓取一些信息并将其填充到数据库中的服务。其次是一个 Web 界面(部署在 tomcat 上),用户可以从中浏览该信息。
实现第一个组件的最佳方法是什么?它应该作为后台守护进程/服务还是容器内的线程运行?
我有一个 Java EE 应用程序,它有两个组件:第一个是从 Internet 上抓取一些信息并将其填充到数据库中的服务。其次是一个 Web 界面(部署在 tomcat 上),用户可以从中浏览该信息。
实现第一个组件的最佳方法是什么?它应该作为后台守护进程/服务还是容器内的线程运行?
我会亲自将它们分成不同的过程。除此之外,这意味着您可以重新启动一个而不必担心另一个。这也意味着您可以真正轻松地将它们部署在不同的机器上,而无需为实际上不需要 Web 界面的服务安装 Tomcat。
根据应用程序框架的类型,Spring 允许您使用Quartz或java.util.concurrent
框架。Spring 有一个TaskExecutor
抽象(参见 Spring文档),它简化了很多,但请检查哪个最适合您的设计。
然后,Spring 或 Quartz(由 Spring 管理)控制线程或执行程序或作业的创建和启动/停止,以及它们的频率/周期和其他调度参数,并且还管理您可能需要的任何作业池。
我将这些用于我编写的任何 Java EE 应用程序中的所有后台任务和批处理作业,没有任何问题。由于作业是 Spring 管理的 POJO,它们可以访问 Spring 所需的完整依赖注入框架等,当然,您可以在需要更改或扩展时通过简单更改应用程序配置 XML 文件在调度程序框架之间切换.
在 Web 容器中拥有后台作业没有任何问题,但您必须让 Web 容器知道它,这样它才能正确停止和启动。
查看 web.xml 中的 load-on-startup 标记。在http://wiki.metawerx.net/wiki/Web.xml.LoadOnStartup上有一些建议