所以我有一个正在运行的小 Tomcat Web 应用程序,具有以下结构:
- 主 Servlet
- 作业 A 的类
- 工作 B 的类(class)
- 作业C类
- 用于各种作业执行的大量类
Web 应用程序是通过 ant 编译和部署的。此刻,我得到了一个包含所有类的漂亮的 Project.war。
基本上,主 servlet 充当调度程序。根据收到的网络请求,它会在新线程中启 Action 业 A、B 或 C。
我想改进我的应用程序,以便我可以在不影响正在运行的进程的情况下为作业 A/B/C 重新部署类。以下是我对它的概念化:
- 我部署用作调度程序的主要 servlet。
- 我部署 A.war、B.war、C.war
- 我负责 B.war
- 我重新部署了A.war,B.war还在运行
- 我负责 A.war
- B.war 完成,其输出通过主 servlet 发回。
老实说,我不知道从哪里开始或从哪里看。我考虑过使用 ProcessBuilder 并在命令行中执行 jar/war,但感觉这是最不安全的事情。
欢迎任何意见。
谢谢!
最佳答案
我相信您需要一个模块化应用程序,其中有多个插件(在您的情况下是作业),可以在需要时加载或卸载,并在可用时使用。检查this stackoverflow 问题它可以给你一点帮助。
但为了简单起见,在之前的工作中,我们需要在不使用 OSGI 的情况下实现类似 OSGI 的功能,我们使用 serviceLoader 构建了 API并为我们的模块(在您的工作案例中)创建了一个接口(interface),每个 jar 都有一个实现该接口(interface)的类。一旦需要该作业,您可以从服务加载器调用它(如果存在),您可以使用它,如果不存在则抛出一些错误。
关于java - Tomcat - 运行外部 JAR/WAR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49836977/