java - 使用 Apache tomcat 将项目分为两部分

标签 java spring apache spring-mvc tomcat

我的应用程序有两个部分:管理客户端部分。

  • 在管理中,管理员上传文件并填写表格并制作其他一些管理工具。

  • 在客户端,用户对管理部分保存的实体进行搜索。

我在与tomcat服务器相同的项目中运行它,但有时在上传文件时我得到Java Heap问题,服务器宕机,用户无法再进行搜索,直到我重新启动服务器,而且我不想通过上传文件来收取带宽费用。并且 session 变量和超时之间存在冲突。

所以我想将它们分成两个独立项目

  1. 如何运行两个项目,以便在管理项目关闭时我的客户可以继续使用我的网络应用?
  2. 我如何在客户端和管理部分之间调用公共(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/

相关文章:

java - 从 tomcat 服务器中发出 http 请求的正确方法是什么

java - 未修饰的 JDialog 边框

spring - Spring Boot 和 Spring IO 是什么关系?

apache - 使用 htaccess 将多个域(http https www 和非 www)重定向到新域

java - Android Parcelable Class - 内部类不能有静态声明

java - Hive - 启动时的 Metastore 连接

SpringMVC 应用程序...为什么应用程序上下文被初始化两次?

java - Spring 不使用 mongo 自定义转换器

apache - 设置动态虚拟主机(Ubuntu 上的 Apache2)

apache - 配置 Tomcat 以利用浏览器缓存?