@Luiggi Mendozaのアイデアによると、私は少し立ち往生しています...
私は自分のjsfに以下を追加しました:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui"
xmlns:f="http://java.sun.com/jsf/core"
template="/templates/layoutUser.xhtml">
<ui:define name="content">
<p:growl widgetVar="growl" showDetail="true" />
<h:form>
Fanciest Page ever
</h:form>
<p:socket onMessage="handleMessage" channel="/notifications" />
<script type="text/javascript">
function handleMessage(facesmessage) {
facesmessage.severity = 'info';
growl.show([ facesmessage ]);
}
</script>
</ui:define>
</ui:composition>
セッションスコープのBeanでTimerTaskを呼び出しています。
@PostConstruct
public void initLazyModel() {
getTimerMB().startTimer(this);
System.out.println("Timer started");
}
私のタイマーは次のようになります。
@ManagedBean(name = "timerMB")
@SessionScoped
public class TimerManagedBean extends TimerTask {
private int counter;
private Timer timer;
private ArtikelManagedBean artikelMB;
public void startTimer(ArtikelManagedBean artikelMB){
this.artikelMB = artikelMB;
this.timer = new Timer();
Calendar date = Calendar.getInstance();
date.set(2012, 3, 28, 21, 28);
//execute every 10 seconds
timer.schedule(this, date.getTime(), 10000);
}
@PreDestroy
public void cancelTimer(){
this.timer.cancel();
System.out.println("UpdateTimer cancelled!");
}
@Override
public void run() {
counter++;
System.out.println("Upadatetimer started: "+ new Date()+" ("+counter+")");
PushContext pushContext = PushContextFactory.getDefault()
.getPushContext();
pushContext.push("/notifications", new FacesMessage("Simple",
"Test"));
}
}
うーん...何も起こらないけど、何か起こるはずだよね?それは私に「シンプル」と「テスト」で通知を与えるはずです、私は推測します...
アップデート:
Luiggi Mendozaありがとうございます!ダイアログを表示するための非常に簡単な方法で管理しました(サーバーサイドと呼びます)。次のサーブレットをweb.xmlに追加しました。
<servlet>
<servlet-name>Push Servlet</servlet-name>
<servlet-class>org.primefaces.push.PushServlet</servlet-class>
<init-param>
<param-name>org.atmosphere.useBlocking</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>org.atmosphere.cpr.sessionSupport</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Push Servlet</servlet-name>
<url-pattern>/primepush/*</url-pattern>
</servlet-mapping>