我正在设计/开发一个最终将作为WAR部署到Tomcat的Web应用程序。该应用程序的一个功能是用户能够将图像上传到我们的服务器并编辑它们(生成缩略图等)。我们将使用ImageMagick
及其Java适配器库IM4Java
。
最初的原型表明,每次重新部署应用程序时,ImageMagick都需要一些时间在我们的服务器上“预热”。这促使我们考虑两种可能性之一:
ImageService.war
Web服务,该服务与主应用程序一起部署,基本上处理所有对IM4Java
的调用(例如,公开一个RESTful服务,并在收到请求时运行ImageMagick;主Web应用程序然后可以在同一本地文件系统上找到已编辑的文件);或Thread
子类(即ImageServiceThread
),启动它并在部署时运行它,并确保在Tomcat取消部署应用程序时关闭它这两个前景让我在更抽象的意义上思考这个问题:什么时候应该简单地将工作委托给一个单独的线程,何时适合制作一个完整的,独立的应用程序(在我们的如果是WAR)?
我们的主要应用程序将是此“图像服务”的唯一用户,我认为单独的WAR是过度杀伤和不必要的。但我以前从未处理过Tomcat内部的线程,也不确定是否有可能产生并杀死一个线程,使其生命周期与主/主应用程序线程的生命周期一致。
应该考虑哪种因素作为此类决定的一部分?提前谢谢。
答案 0 :(得分:1)
ImageMagick需要一些时间来“热身”
最好卸载servlet容器外的内存/ CPU密集型操作。实际上,在单独的JVM中启动映像服务。
由于您的应用程序将在内存中加载图像并对其进行编辑,因此您可以预期频繁的垃圾收集会影响servlet容器的性能,从而影响Web应用程序其他部分的性能。
答案 1 :(得分:1)
一定要在Web应用程序中预先加载ImageMagick,以使其正常运行。这样,你永远不会忘记应该将两个webapps一起部署。
将一个特定的webapp所需的所有东西放在一个地方是个好主意:这就是创建WAR格式和ServletContextListener
之类的东西的原因。
老实说,我不确定我是否愿意“加载”IM的预加载 - 只需从ServletContextListener
运行一些示例命令并同步加载它。