我正在设计/开发最终将作为 WAR 部署到 Tomcat 的 Web 应用程序。此应用程序的功能之一是用户能够将图像上传到我们的服务器并进行编辑(生成缩略图等)。在后台,我们将使用 ImageMagick
及其 Java 适配器库 IM4Java
。
初始原型(prototype)表明,每次我们重新部署应用程序时,ImageMagick 都需要一些时间在我们的服务器上“预热”。这促使我们考虑以下两种可能性之一:
- 创建一个
ImageService.war
web 服务,它与主要应用程序一起部署,基本上处理所有对IM4Java
的调用(公开,比如说,一个 RESTful 服务,只是在收到请求时运行 ImageMagick;然后主 Web 应用程序可以在同一本地文件系统上找到已编辑的文件);或 - 只需创建一个
Thread
子类(即ImageServiceThread
),启动它并在部署时运行它,并确保它在 Tomcat 取消部署应用程序时关闭
这两个前景让我从更抽象的意义上思考这个问题:什么时候应该简单地将工作委托(delegate)给一个单独的线程,什么时候适合制作一个成熟的、独立的应用程序(在我们的发生 war )?
我们的主要应用程序将是此“图像服务”的唯一用户,这让我认为单独的 WAR 是过分的且不必要的。但我以前从未处理过 Tomcat 内部的线程,我不确定是否可以生成和终止线程以使其生命周期与主/主应用程序线程的生命周期一致。
做出此类决定时应考虑哪些因素?提前致谢。
最佳答案
在需要其正常运行的Web应用程序中,绝对保留ImageMagick的预加载。这样,您就不会忘记这两个 Web 应用程序应该一起部署。
将特定 web 应用程序所需的所有内容放在一个地方是个好主意:这就是创建 WAR 格式和存在诸如 ServletContextListener
之类的东西的原因。
老实说,我不确定我是否愿意“线程化”IM 的预加载——只需从 ServletContextListener
运行一些示例命令并让它同步加载。
关于java - 什么时候用线程,什么时候用 WAR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11055986/