Reputation: 321
I am using JSR356 websockets in my web application and I am wondering why the ServerEndpoint PostConstruct method is called twice?!
This is the server.log of my WildFly server:
PushMessageEndpoint: -> onPostConstruct(): at.luxbau.mis2.web.controller.prozess.PushMessageEndpoint@653dde97[session=<null>,sessionId=<null>]
PushMessageEndpoint: <- onPostConstruct()
PushMessageEndpoint: -> onPostConstruct(): at.luxbau.mis2.web.controller.prozess.PushMessageEndpoint@653dde97[session=<null>,sessionId=<null>]
PushMessageEndpoint: <- onPostConstruct()
PushMessageEndpoint: -> onOpen(): io.undertow.websockets.jsr.UndertowSession@43a032ff, M3OLaoTSRxM7EZWLH1LSzp7hFQBe24QvwLG7jDqr
PushMessageEndpoint: endpoints.size=1
PushMessageEndpoint: endpoint: at.luxbau.mis2.web.controller.prozess.PushMessageEndpoint@653dde97[session=io.undertow.websockets.jsr.UndertowSession@43a032ff,sessionId=M3OLaoTSRxM7EZWLH1LSzp7hFQBe24QvwLG7jDqr]
PushMessageEndpoint: <- onOpen()
Servide side endpoint is in PushMessageEndpoint.java:
@ServerEndpoint(value = "/push/{sessionId}")
public class PushMessageEndpoint {
private static final ILogger logger = LogFactory.getLogger(PushMessageEndpoint.class);
private static final Set<PushMessageEndpoint> ENDPOINTS = new CopyOnWriteArraySet<>();
private Session session;
private String sessionId;
@PostConstruct
void onPostConstruct() {
logger.entry(this);
logger.exit();
}
@OnOpen
public void onOpen(Session session, @PathParam("sessionId") String sessionId) {
logger.entry(session, sessionId);
this.session = session;
this.sessionId = sessionId;
ENDPOINTS.add(this);
logEndpoints();
logger.exit();
}
private void logEndpoints() {
logger.debugf("endpoints.size=%d", ENDPOINTS.size());
ENDPOINTS.forEach(ep -> logger.debugf("endpoint: %s", ep));
}
@Override
public String toString() {
return new ToStringBuilder(this)
.append("session", session)
.append("sessionId", sessionId)
.toString();
}
}
This template.xhtml is used for each page:
<!-- Auf jeder Seite einen WebSocket mit der SessionId öffnen -->
<h:outputScript>
var sessionId = "${request.session.id}"
openWebSocket(sessionId);
</h:outputScript>
<h:outputScript library="js" name="websocket.js"/>
This is the Websocket Javascript code: websockets.js
function openWebSocket(sessionId) {
if (window.WebSocket) {
var wsUri = getRootUri() + "/" + sessionId;
var ws = new WebSocket(wsUri);
ws.onmessage = function (event) {
var message = event.data;
console.log(message);
if (window["updateMessage"]) {
// RemoteCommand 'updateMessage' mit der Nachricht als Parameter aufrufen
window["updateMessage"]([{'name': 'message', 'value': message}]);
}
// close after receiving message
// ws.close();
}
ws.onopen = function (event) {
console.log("open web socket : " + wsUri);
}
ws.onclose = function (event) {
console.log("close web socket : " + wsUri
+ " (" + event.code + ") " + event.reason + ", wasClean is " + event.wasClean);
}
} else {
console.log("Browser does not support WebSockets!");
}
}
Upvotes: 0
Views: 59