2012-03-08 60 views
0

我有一個應用程序,它顯示了p:DataTable中的一些數據...這個表可以被很多用戶訪問。當一個用戶修改表中的一條記錄(創建,編輯,刪除)時,這個動作被通知給一個@ApplicationScoped ManagedBean,通知所有其他會話(由其他用戶打開),表中的項目被更改,然後它必須從數據庫重新加載。 正如你可以看到這是一個通知,該項目改變了所有的會話控制器,如何通過多個會話顯示消息? JSF 2.1和Primefaces 3.1

/** 
* @author Simone Rondelli 
*/ 
@ManagedBean(name="singleton") 
@ApplicationScoped 
public class SingletonBean { 

    private int count; 
    private HashMap<Class, List<AbstractController>> sessions; 

    public SingletonBean() { 
     sessions = new HashMap<Class, List<AbstractController>>(); 
    } 

    public void addSession(AbstractController session, Class c) { 
     List<AbstractController> sessionList = sessions.get(c); 
     if(sessionList == null) 
      sessionList = new ArrayList<AbstractController>(); 

     sessionList.add(session); 
     sessions.put(c, sessionList); 
    } 

    public void notifyItemsChanged(Class type) { 
     for(AbstractController a : sessions.get(type)) { 
      a.prepareList(); 
      a.addWarningMessage("Attenzione i record sono stati modificati!!"); 
     } 
    } 
} 

這是在一個AbstractController的代碼,「嘗試」,以示消息

public void addWarningMessage(String msg) { 
    //JsfUtil.addWarningMessage(msg); 
    FacesMessage facesMsg = new FacesMessage(FacesMessage.SEVERITY_WARN, msg, msg); 
    FacesContext.getCurrentInstance().addMessage(null, facesMsg); 
} 

如果按f5,在任何其他頁面中顯示新記錄...但是我希望將這些消息發送到所有其他會話...現在,使用我的代碼,消息顯示在修改完成的頁面中,很多次打開的會話數量...所以如果我有3個會話與3個用戶,其中一個在表中做了一些改變,他會在他的頁面看到3條消息,含有其他用戶看不到任何東西。

  • 如何將消息發送給所有會話?
+0

爲什麼不直接使用請求/視圖範圍的bean來存儲數據並將該高速緩存作業委託給持久層(JPA等)? – BalusC 2012-03-10 02:45:33

回答

0

我認爲你應該檢查Primefaces推,看看那邊的例子...

PrimePush

或者你可以嘗試阿賈克斯投票AJAX Poll

這裏的Ref 'for Push in Glassfish question

+0

謝謝!我嘗試使用它,但它不工作..我讀過它是相當bug ..例如,當我調用RequestContext.getCurrentInstance()。push(CHANNEL,msg);應用程序掛起.. 2012-03-08 15:25:57

+0

還沒有用過它我自己...但我知道一些使用它... – Daniel 2012-03-08 15:36:22

+0

你有任何其他的想法? – 2012-03-09 09:43:25