2012-05-15 71 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

相關問題