2015-03-13 45 views
0

我們有一個帶有primefaces的Java EE應用程序,我們想知道是否有一種方法來創建「全局」應用程序變量。Java EE應用程序和「全局」變量

我的意思是:設想user1正在編輯document1,當user2嘗試訪問document1時,我們想顯示一條消息:「User1正在編輯此文檔」。

因此,我們必須使用「全局」來跟蹤用戶操作或文檔鎖定等,實現此目的的最佳方法是什麼?

我在搜索互聯網,但意見不同,通常沒有提供任何工作示例,因此歡迎鏈接和指針!

編輯:上面只是一個例子,請不要專注於「文檔」,你可以稱之爲「資源」,或者任何你喜歡的。我以文檔鎖定問題爲例,但它可能是總計數器或其他需要在應用程序級別存儲的其他內容。 我在問什麼(抱歉,如果不清楚)不是如何管理文檔鎖定,但如果可能的話,在Java EE的應用程序級別擁有「全局」變量的最佳方式是什麼?

謝謝

只是好奇:爲什麼如果我添加「HOLA」或「喜」,作爲一線它消失的時候我保存編輯?

+0

如何維護文檔? – 2015-03-13 16:21:54

+0

對不起,我不明白這個問題。你可以請添加細節? – 2015-03-13 16:27:19

+0

我的意思是你使用CMS,數據庫或其他東西?你如何管理文件?如果CMS,那麼我想你有選項來鎖定和檢查文檔的狀態。 – 2015-03-13 16:36:36

回答

1

外部存儲這種映射如果你想在全球範圍內保存的東西,在Java EE 6 +它應該使用適用範圍

http://docs.oracle.com/javaee/6/api/javax/enterprise/context/ApplicationScoped.html

對於例如:

@ApplicationScoped 
class Global { 
    void setDocInUse(boolean) { ... } 
    boolean isDocInUse() { ... } 
} 

@RequestScoped 
class MyDocEditor { 

    @Inject Global global; 

    public void edit() { 
     if (global.isDocInUse()) { ... } 
     else { ... } 
    } 
} 
+0

我認爲這個解決方案不適用於開箱即用的羣集。是嗎? – badera 2015-11-26 18:34:56

+0

不,@ApplicationScoped不在集羣成員之間共享。如果你想要一個全球聚集值,這是一個不同的故事 – AndresQ 2015-11-26 20:05:56

-1

對於大多數簡單的情況,您可以在託管bean內部使用一個靜態字段,因爲它將由託管bean的所有實例共享。例如,讓我們想象一下,編輯您的用戶具有以下Bean交互文件:

@ManagedBean 
@ViewScoped  
public class DocumentManager { 
    private static Map<Long, String> editedDocs = new HashMap<>(); 
    private Document selectedDoc; 

} 

那就讓我們想像中,用戶已經從數據表中選擇的文檔(例如後,使其進入了selectedDoc場

然後在editDocument方法中,我們添加了文檔的ID和對點擊的用戶的用戶名:),他們通過點擊其action屬性指向方法editDocument這樣的按鈕獲取文檔編輯頁面按鈕到跟蹤當前編輯文檔的映射。

public String editDocument() { 
    if (!editedDocs.contains(selectedDoc.getId())) { 
     String username = FacesContext.getCurrentInstance().getExternalContext().getUserPrincipal().getName(); 
     editedDocs.put(selectedDoc.getId(), username);  

     String msg = "User " + username + " is already editing the document"; 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, msg, msg)); 
    } 
    return theAddressOfEditDocumentPage; 
} 

請不要忘記在用戶離開編輯頁面時刪除的文檔ID,並從editedDocs的用戶名(通過單擊保存或取消按鈕)。 另一種可能性是(在例如數據庫)

+1

此解決方案不是線程安全的,也不能在集羣環境中工作 – 2015-03-16 02:00:29

+0

我提供的代碼旨在說明如何完成它的想法,它不是一個公牛即興使用的代碼。如果你還記得,我還打算將外部映射存儲在集羣環境中。所以它找到你downvote毫無意義。 – akhilless 2015-03-16 06:04:22

+0

另外通過我不記得OP提及他使用羣集的方式。 – akhilless 2015-03-16 06:11:30