以前、リリース前のJSF2.3を利用してWebsocketを試したことを書きました。
その時はWildFlyで動かすことができなかったのですが、WildFlyも13.0.0.Finalになり、
JSF2.3を含んだJavaEE8をプレビューモードで起動できるようになったので、もう一度Websocketを試してみることにします。
環境
-
macOS High Sierra
-
Java™ SE Runtime Environment (build 1.8.0_91-b14)
-
WildFly 13.0.0.Final
実装
フルセットのコードは下記にあります。
https://github.com/kokuzawa/sandbox/tree/master/websocket-example
通常のJSFの設定の他に、下記設定がweb.xmlに必要です。
web.xml
<context-param>
<param-name>javax.faces.ENABLE_CDI_RESOLVER_CHAIN</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>javax.faces.ENABLE_WEBSOCKET_ENDPOINT</param-name>
<param-value>true</param-value>
</context-param>
管理BeanはApplicationScopeの必要があります。
PushBean.java
import javax.enterprise.context.ApplicationScoped;
import javax.faces.push.Push;
import javax.faces.push.PushContext;
import javax.inject.Named;
import java.io.Serializable;
import java.util.Calendar;
@Named
@ApplicationScoped
public class PushBean implements Serializable
{
@Push(channel = "clock")
private PushContext push;
public void clockAction()
{
final Calendar now = Calendar.getInstance();
final String time = now.get(Calendar.HOUR_OF_DAY) + ":" +
now.get(Calendar.MINUTE) + ":" + now.get(Calendar.SECOND);
push.send(time);
}
}
XHTMLで重要なのは下記だけです。
websocket
タグの chaannel
属性で指定した値と、管理Beanの Push
アノテーションで指定した値が一致する必要があります。
index.xhtml
<f:websocket channel="clock" onmessage="socketListener" />
<script type="text/javascript">
function socketListener(message, channel, event) {
document.getElementById("clockId").innerHTML += message + "<br/>";
}
</script>
実行
起動オプションに下記を設定することで、WildFlyがJavaEE8モードで起動します。
-Dee8.preview.mode=true
前回と異なり、余計な設定をしなくても問題なく実行できました。