0

我正在设计/开发一个最终将作为 WAR 部署到 Tomcat 的 Web 应用程序。此应用程序的功能之一是用户能够将图像上传到我们的服务器并进行编辑(生成缩略图等)。在幕后,我们将使用ImageMagick它的 Java 适配器库IM4Java

初始原型表明,每次我们重新部署应用程序时,ImageMagick 都需要一些时间在我们的服务器上“预热”。这促使我们考虑以下两种可能性之一:

  • 创建一个ImageService.war与主应用程序一起部署的 Web 服务,并基本上处理对IM4Java底层的所有调用(例如,公开一个 RESTful 服务并在收到请求时运行 ImageMagick;然后主 Web 应用程序可以找到已编辑的文件)在同一个本地文件系统上);或者
  • 只需创建一个Thread子类(即ImageServiceThread),启动它并在部署时运行它,并确保它在 Tomcat 取消部署应用程序时关闭

这两个前景让我从更抽象的意义上思考了这个问题:什么时候应该简单地将工作委托给一个单独的线程,什么时候适合制作一个成熟的、单独的应用程序(在我们的例子中是一个 WAR)

我们的主要应用程序将是这个“图像服务”的唯一用户,这让我认为单独的 WAR 是矫枉过正和不必要的。但我以前从未处理过 Tomcat 内部的线程,并且不确定是否可以生成和终止线程,以便其生命周期与主/主应用程序线程的生命周期一致。

作为此类决定的一部分,应考虑哪些因素?提前致谢。

4

2 回答 2

1

ImageMagick 需要一些时间来“热身”

最好在 servlet 容器之外卸载内存/cpu 密集型操作。事实上,在单独的 JVM 中启动您的图像服务。

由于您的应用程序将在内存中加载图像并对其进行编辑,因此您可以预期频繁的垃圾收集会通过影响 Web 应用程序其他部分的性能来阻碍 servlet 容器的性能。

于 2012-06-15T19:05:29.117 回答
1

一定要在需要它正常运行的 Web 应用程序中保留 ImageMagick 的预加载。这样一来,您就永远不会忘记这两个 web 应用程序应该部署在一起。

将特定 webapp 所需的所有东西放在一个地方是一个好主意:这就是创建 WAR 格式以及ServletContextListener存在诸如 s 之类的东西的原因。

老实说,我不确定我是否会费心去“线程”预加载 IM —— 只需从 a 运行一些示例命令ServletContextListener并让它同步加载。

于 2012-06-15T21:04:19.237 回答