'WebSockets Support On IBM WebSphere Application Server 9.0.5.6

I am migrating an enterprise-level application based on JBOSS EAP 7.3 using the WebSocket Servlets to IBM WebSphere Application Server 9.0.5.6 (WAS). The problem is that when I try to connecting to WebSocket endpoint it does nothing. In WebSphere, I have configured all virtual hosts and ports accordingly and my WebSocket endpoint class looks like below.

@ServerEndpoint("/WebSocketServices")
public class ClientConnectorWebSocketCore {

    private static final OMSLogHandlerI logger = new Log4j2HndlAdaptor("ClientConnectorWebSocketCore");
    private ClientConnectorFacadeWrapperRemote clientConnectorFacadeRemote;
    private EJBServiceLocatorI ejbServiceLocatorI;

    @OnOpen
    public void onConnectionOpen(Session session) {
        session.setMaxIdleTimeout(120000); //todo //milli seconds
        getEjbServiceLocatorI();
        logger.elkLog("29", LogEventsEnum.WSOCKET_SESSION_CONNECT, " Session Create:" + session.getId());
    }

    @OnMessage
    public String onMessage(String message) {
        return handleJSONRequest(message);
    }

    @OnClose
    public void onConnectionClose(Session session) {
        logger.elkLog("42", LogEventsEnum.WSOCKET_SESSION_CLOSE, " Session Close:" + session.getId());
    }

    @OnError
    public void onConnectionError(Session session, Throwable t) {
//        logger.info("LN:47", session.getId(), LogEventsEnum.WEB_SOCKET_ONERROR, "WebSocket OnException" + t.getMessage());
        logger.elkLog("48", LogEventsEnum.WEB_SOCKET_ONERROR, " Session error:" + session.getId() + ", Msg:" + t.getMessage());
    }

    public void msgBroadCast(Session session, String msg) {
        for (Session session1 : session.getOpenSessions()) {
            if (session1.isOpen()) {
                session1.getAsyncRemote().sendText(msg);
            }
        }
    }

    private EJBServiceLocatorI getEjbServiceLocatorI(){
        if (ejbServiceLocatorI == null){
            ejbServiceLocatorI =
                    (EJBServiceLocatorI) SpringBeanFactoryLoader.getInstance().getBeanLoader().getBean(EJBServiceLocatorI.class);
        }
        return ejbServiceLocatorI;
    }

    private ClientConnectorFacadeWrapperRemote getClientConnectFacade() {
        if (clientConnectorFacadeRemote == null) {
            try {
                ejbServiceLocatorI = getEjbServiceLocatorI();
                clientConnectorFacadeRemote =
                       (ClientConnectorFacadeWrapperRemote) ejbServiceLocatorI.contextLookupConnectorFacadeRemote(ClientConnectorFacadeWrapperRemote.class);
            } catch (Exception e) {
                logger.error("LN:66", "Error in Creating Client connector   " + e.getMessage(), e);
            }
        }
        return clientConnectorFacadeRemote;
    }

    private String handleJSONRequest(String jsonRequest) {
        ClientConnectorFacadeWrapperRemote clientConnector = getClientConnectFacade();
        String response = null;
        if (clientConnector != null) {
            response = clientConnector.processMessage(jsonRequest);
        }
        return response;
    }

    @OnMessage
    public void pongMessage(Session session, PongMessage msg) {
        msg.getApplicationData().toString();
    }


    public void setEjbServiceLocatorI(EJBServiceLocatorI ejbServiceLocatorI) {
        this.ejbServiceLocatorI = ejbServiceLocatorI;
    }
}

Any advice is highly appreciated.



Solution 1:[1]

If your requests flow through a web server with WebSphere plugin, you need to ensure plugin is at level 9.0.5.6 or higher due to bug (PH27966) which can block websocket traffic.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Betsy Riggins