raho
raho

Reputation: 321

ServerEndpoint PostConstruct called twice

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

Answers (0)

Related Questions