gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:32:26 29 4
gpt4 key购买 nike

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

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

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

我在与 tomcat 服务器 相同的项目中运行它,但有时在上传文件时我遇到 Java 堆 问题,服务器出现故障,用户无法进行搜索直到我重新启动服务器并且我不想通过上传文件来收取带宽。并且 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/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com