2011-09-21 80 views
0

我有一個JavaEE應用程序需要訪問文件以獲取有關安裝的某些信息。EJB中全局訪問的屬性

此訪問是隻讀的,我不需要在應用程序內更改該文件,即我不需要直接「文件」,只需要它的內容(一個字節數組)。

使用文件系統的EJB存在限制。我確實瞭解與此相關的問題,但我無法找出解決方案。

文件路徑應該由用戶配置,但不需要跟蹤對文件內容的更改。一旦加載,它將保持不變,除非用戶選擇另一個文件。所以,我無法將它打包在應用程序存檔中。

這種基於文件的方法是很久以前由我們擁有的一些遺留系統做出的決定。現在沒有可行的方法來改變它,即我需要我的JavaEE應用程序使用該文件(至少一次)來加載它的內容。

另一個限制是該文件不能保存在數據庫中。

我該如何做到這一點,而不違反文件系統訪問的EJB限制?

我想過用戶上傳文件到服務器,然後在服務器上保存這些信息。但我該怎麼做?該信息應該是全局可訪問的,包括服務器的多個實例(例如,在集羣體系結構中)。

用戶應該配置一次該文件(不一定在主應用程序內,它可能是其他應用程序只是配置此)。即使服務器重新啓動,仍然可以訪問文件的內容,而無需用戶進一步配置。

我在GlassFish v2.1.1服務器上使用EJB 3.0規範的JavaEE 5。

謝謝, Thiago。

+0

有趣的需求,爲什麼你不能堅持數據庫中的數據?用戶現在是否將文件上傳到每個集羣成員? – home

+0

我無法將其保存在數據庫中,因爲此文件可能包含訪問它的信息。所以我沒有辦法在沒有獲取文件內容的情況下訪問官方數據庫。順便說一下,如果我只是爲了這個目的而使用簡單的數據庫(比如H2),那就沒問題。用戶只能上傳文件一次。今天我們直接訪問文件系統,違反了限制。 –

+0

如果今天有效,爲什麼要改變它?雖然這不是一個好習慣,但我已經看到許多基於EJB的應用程序正在訪問文件系統...... – home

回答

1

我的建議如下:

  1. 用戶JAX-WS與讓用戶上傳文件通過一個WebService(您可以提供客戶端)EJB 3。
  2. 使用Context類的menthod bind()將文件的內容存儲在JNDI中。據我所知JNDI將在集羣中傳播,但也許你需要檢查你的Java EE應用服務器的文檔。

希望它有用。

+0

我在Google搜索了這個解決方案,並且發現[在JavaHowTo的帖子](http://javahowto.blogspot.com/2010/11/programmatically-bind-global-jndi.html),說綁定會直到服務器重新啓動。即使應用程序服務器重新啓動,我們也需要訪問這些信息。 –

+0

該示例顯式解析了servlet的preDestroy方法中的變量。所以如果你想讓變量在重新啓動時可用,就不要取消綁定變量。 –

0

你必須從EJB兩種選擇:

1)違反規範和使用標準的Java文件API從您的EJB訪問它。如果你理解這在聚類,交易等方面意味着什麼,那麼可以是'安全'的。既然你只是在進行只讀訪問,你應該沒問題。

2)使用支持文件系統訪問的JCA適配器。你可以自己寫,嘗試一個開源的(我認爲有一個源代碼僞造),或者購買一個 - 我認爲oracle銷售一個用於Glassfish oracle版本的版本。可能是爲了你的情況矯枉過正。

您也可以將Web應用程序組件添加到您的項目(Servlet)中,該項目可執行文件訪問,因爲該規範允許使用文件io。