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

时间:2016-10-20 09:51:24

标签: java spring apache spring-mvc tomcat

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

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

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

我在与 tomcat服务器相同的项目中运行此项,但有时上传文件时出现Java Heap问题且服务器停机,用户无法再进行搜索我重新启动服务器,我也不想通过上传文件来收取带宽。会话变量和超时之间存在冲突。

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

  1. 如何运行两个项目,如果管理项目停止,我的客户继续使用我的网络应用程序?
  2. 如何在客户端和客户端之间调用公共服务(控制器)和公共资源(img,files,css,js,...)管理部分?

1 个答案:

答案 0 :(得分:2)

你的问题很广泛,所以几乎不可能回答。

堆问题

首先,堆问题的原因可能是你在内存中缓冲整个上传的文件(即你将上传的图像反序列化为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中< / strong>(即单独的Tomcat实例)。

要共享公共类,如控制器,只需将它们分成两个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