2012-05-15 27 views
7

所以下面的问题: 我们有一个负载均衡器,后面有n个服务器。在每台服务器上都有一个PDF项目(战争)和一个PDF生成器项目一起安装在耳朵文件中(不同的战争)。 我现在想从另一场战争中看pdf。如何从Java EE服务器(JBoss)上同一耳朵中的不同战争中访问文件?

问题是:我不知道我正在运行的服务器的IP地址,并使用dns查找,我可能通过负载均衡器在不同的服务器上结束。此外,访问/安全约束可能会有问题,因为服务器本身不是有权访问pdf战争项目的pdf文件位置的有效用户。

有没有办法获得类似getResourceAsStream()的东西,它可以在耳朵内的不同模块/战争文件中工作?

+0

我是否理解“pdf-builder”项目直接在部署的爆炸式WAR目录中生成一些/许多PDF? –

+0

pdf项目基本上只是一个静态pdf文档的集合。你有例如WEB-INF/pdfs/a.pdf – Toskan

+1

使用具有可配置路径的节点(NFS,CIFS ...)共享存储不是更容易吗? –

回答

5

可以移动.PDFs到一个单独的jar(即PDF-builder.jar),并把它放入.EAR 在清单您.WAR(META-INF/MANIFEST.MF)把这条线:

Class-Path: pdf-builder.jar 

现在你可以使用你的类加载器加载.PDF。这是符合J2EE的。

3

您需要提供文件的绝对路径才能访问不在当前类路径中的资源。

你可以调用

serverletContext.getRealpath("/");
会给出直到服务器节点(上下文)的路径。从那里你可以导航到文件。

还有一种方法是,Jboss在引导时使用(或设置)几个环境变量。您可以使用这些属性来获取当前节点(如“默认”)。以下两个属性将为您提供当前服务器节点的绝对路径。如果getProperty不起作用,请使用System.getenv('varname')。从那里你可以导航。 Here是jboss使用的系统变量的完整列表。

+1

System.getenv不相关。您提到的所有配置条目都是Java系统属性,可以在命令行上用-D设置,也可以由JBoss代码本身注册 –

+0

如果WAR未爆炸,则需要解压缩以获取PDF文件。 JBoss已经将其部署档案解压缩到了它的临时目录中,但是没有机会猜测WAR可能位于哪个目录中。 –

+0

Spring通过使用'ZipInputStream'读取jar(zip)中的应用程序上下文xml。我想我们可以通过在路径中添加'!'(如path \ xxxx.war!\ xxx.pdf)来读取zip文件。 –

2
  1. 更改.war.jar.ear?)如果部署不要过于频繁。例如在服务器lib目录中,如果你每天重新启动。

  2. 不要部署战争,而是将文件上传到固定目录,即使用rsync这是我的偏好。

  3. 作为@ Rp-说,可能解压缩。

3

WARs旨在相互隔离。他们可以在应用程序类加载器(EAR级别)中看到“up”,但无法访问对等的类加载器。因此,虽然可能有办法让它在特定的应用程序服务器上运行,但这样做不可取。如果操作团队中的某个人改变了部署选项,他们可能不会意识到您依赖于该机制,并会以(可能)神秘的方式破坏应用程序。

试图访问像这样的对等类加载器违反Java EE(如果不是规范的字母,至少其精神)。

如果无法将静态内容放置在单独的服务器上进行访问,至少应将静态PDF插入JAR(如其他人所建议的那样)并将其部署到EAR中。你什么时候这样做,不要忘记将JAR条目添加到声明WAR的清单文件中(否则它不会将JAR加载到应用程序类加载器中)。

+0

当我把jar放入server/lib文件夹时,我会使用classloader来访问它,我想呢? – Toskan

相关问题