我的应用程序有两个部分:管理和客户端部分。
在管理中,管理员上传文件并填写表格并制作其他一些管理工具。
在客户端,用户对管理部分保存的实体进行搜索。
我在与tomcat服务器相同的项目中运行它,但有时在上传文件时我得到Java Heap
问题,服务器宕机,用户无法再进行搜索,直到我重新启动服务器,而且我不想通过上传文件来收取带宽费用。并且 session 变量和超时之间存在冲突。
所以我想将它们分成两个独立项目
- 如何运行两个项目,以便在管理项目关闭时我的客户可以继续使用我的网络应用?
- 我如何在客户端和管理部分之间调用公共(public)服务( Controller )和公共(public)资源(img、文件、css、js...)?里>
最佳答案
您的问题非常广泛,因此几乎无法回答。
堆问题
首先,堆问题的原因可能是您将整个上传的文件缓冲在内存中(即将上传的图像反序列化为 byte[]
或类似的内容)。对于不受信任的内容或合理的大小限制,您永远不会这样做,因为有人可能会上传 16GB 文件并完全破坏您的 RAM。相反,您可以将上传的字节流式传输到磁盘或其他支持流的设备。
FileUpload
from Apache Commons为您提供了一种很好且简单的方法来获取任意大小的上传,并根据大小动态决定是否将它们缓冲在内存或磁盘中:
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
分离应用程序
关于分离应用程序的主题,只需进行 2 次 WAR,这没什么神奇的。但请记住,无论什么原因导致堆问题导致应用程序崩溃,都可能导致整个 JVM 崩溃,因此为了隔离它们,您需要将它们部署到单独的 JVM 中>(即单独的 Tomcat 实例)。
要共享公共(public)类(例如 Controller ),只需将它们分离到两个 WAR 都依赖的 JAR 中即可。一个简单的maven multi-module project就可以了,每个 WAR 一个模块,每个共享 JAR 一个模块。
您可以通过多种方式共享资源:
- 还将它们打包到
META-INF/resources
下的共享 JAR 中:从 Servlet 3.0 开始支持此功能。这是 detailed guide 。这种方法的优点是部署简单,只需将资源 JAR 视为任何其他依赖项即可。缺点是它不允许在不重新启动应用程序的情况下轻松重新部署。 - 将它们部署到共享云端硬盘:您必须管理单独的部署,但您始终可以在不影响应用的情况下重新部署。
与静态资源共享 JAR
如果在您的类路径中(即在 WAR 的 WEB-INF/lib/
内),您有一个包含 META-INF/resources/image.jpg
的 JAR ,您将能够通过以下方式访问它:
http://localhost:8080/<subcontext>/image.jpg
参见the guide了解更多详情。
共享外部位置
您可以告诉 Tomcat 在外部位置查找资源。不同Tomcat版本配置不同:
- 使用别名
<Context aliases="/images=/var/www/images" />
- 使用 Tomcat 8 的相同配置
Resources
.
<Context> <Resources> <PostResources className="org.apache.catalina.webresources.DirResourceSet" base="/var/www/images" webAppMount="/images" /> </Resources> </Context>
然后将静态资源放入 /var/www/images
(例如 /var/www/images/image.jpg
)并通过 http://localhost:8080/<subcontext>/images
访问它们(例如 http://localhost:8080/<subcontext>/images/image.jpg
)。
参见this tutorial了解更多示例。
关于java - 使用 Apache tomcat 将项目分为两部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40151041/