【问题标题】:Tomcat - Running external JAR/WARTomcat - 运行外部 JAR/WAR
【发布时间】:2018-04-14 23:02:16
【问题描述】:

所以我正在运行一个小型 Tomcat Web 应用程序,其结构如下:

  • 主 Servlet
  • 作业 A 类
  • 作业 B 类
  • 作业 C 类
  • 用于各种作业执行的大量类

webapp 是通过 ant 编译和部署的。目前,我得到了一个包含所有类的不错的 Project.war。

基本上,主 servlet 用作调度程序。根据收到的网络请求,它会在新线程中启动作业 A、B 或 C。

我想改进我的应用程序,以便在不影响正在运行的进程的情况下为 Job A/B/C 重新部署类。以下是我的概念化方式:

  • 我部署了主 servlet,用作调度程序。
  • 我部署 A.war、B.war、C.war
  • 我运行 B.war
  • 我重新部署了 A.war,B.war 仍在运行
  • 我运行 A.war
  • B.war 完成,其输出通过主 servlet 发回。

说实话,我不知道从哪里开始或从哪里看。我考虑过使用 ProcessBuilder 并在命令行中执行 jar/war,但感觉这是最不安全的事情。

感谢任何输入。

谢谢!

【问题讨论】:

  • 我相信微服务是您的答案。您的应用程序应通过 Web 服务 (REST) 进行通信,最好将它们中的每一个部署在单独的 docker 容器中。
  • 这是我不知道的事情,我会看看这个谢谢。如果您有任何示例或指南,我将从那里开始反思!
  • 如果您在 servlet 容器中运行时生成自己的线程,那么您几乎肯定是“做错了”。该应用程序是否主要通过 HTTP 进行通信并提供这些服务(例如 Job A、Job B 和 Job C)?如果是这样,容器将取代您的“主 servlet”已经在做的所有事情,并且您的代码可以变得更简单。

标签: java tomcat executable-jar


【解决方案1】:

我相信您需要一个模块化应用程序,其中有多个插件(在您的情况下是作业),可以在需要时加载或卸载,并且一旦可用就可以使用。检查thisstackoverflow 问题它可以给你一点帮助。

但为简单起见,在之前的工作中,我们需要类似 OSGI 的东西而不使用 OSGI,我们使用 serviceLoader 构建 API 并为我们的模块创建了一个接口(在你的情况下是工作)每个 jar 将有一个将实现的类界面。一旦需要该作业,您可以从服务加载器中调用它(如果存在),您可以使用它,如果不存在则抛出一些错误。

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 2019-05-13
    • 1970-01-01
    • 1970-01-01
    • 2011-02-24
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多