Table of Contents
Deploying WebSocket endpoints can be done in two ways. Either deploying via putting the endpoint in the WAR file, or using the ServerContainer methods to deploy the programmatic endpoint in the deployment phase.
The classes that are scanned for in WAR are the following ones:
Classes that implement the jakarta.websocket.ServerApplicationConfig
.
Classes annotated with jakarta.websocket.server.ServerEndpoint
.
Classes that extend jakarta.websocket.Endpoint
.
jakarta.websocket.server.ServerEndpoint
or extending jakarta.websocket.Endpoint
).
Let's have the following classes in the WAR:
Example 3.1. Deployment of WAR containing several classes extending jakarta.websocket.server.ServerApplicationConfig
public class MyApplicationConfigOne implements ServerApplicationConfig { public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses); Set<Class<? extends Endpoint>> s = new HashSet<Class<? extends Endpoint>>; s.add(ProgrammaticEndpointOne.class); return s; } public Set<Class> getAnnotatedEndpointClasses(Set<Class<?>> scanned); Set<Class<?>> s = new HashSet<Class<?>>; s.add(AnnotatedEndpointOne.class); return s; } } public class MyApplicationConfigTwo implements ServerApplicationConfig { public Set<ServerEndpointConfig> getEndpointConfigs(Set<Class<? extends Endpoint>> endpointClasses); Set<Class<? extends Endpoint>> s = new HashSet<Class<? extends Endpoint>>; s.add(ProgrammaticEndpointTwo.class); return s; } public Set<Class> getAnnotatedEndpointClasses(Set<Class<?>> scanned); Set<Class<?>> s = new HashSet<Class<?>>; s.add(AnnotatedEndpointTwo.class); return s; } } @ServerEndpoint(value = "/annotatedone") public class AnnotatedEndpointOne { ... } @ServerEndpoint(value = "/annotatedtwo") public class AnnotatedEndpointTwo { ... } @ServerEndpoint(value = "/annotatedthree") public class AnnotatedEndpointThree { ... } public class ProgrammaticEndpointOne extends Endpoint { ... } public class ProgrammaticEndpointTwo extends Endpoint { ... } public class ProgrammaticEndpointThree extends Endpoint { ... }
According to the deployment algorithm classes AnnotatedEndpointOne
, AnnotatedEndpointTwo
,
ProgrammaticEndpointOne
and ProgrammaticEndpointTwo
will be deployed.
AnnotatedEndpointThree
and ProgrammaticEndpointThree
will not be
deployed, as these are not returned by the respective
methods of MyApplicationConfigOne
nor MyApplicationConfigTwo
.
Endpoints may be deployed using jakarta.websocket.server.ServerContainer
during the application initialization phase.
For websocket enabled web containers, developers may obtain a reference to the ServerContainer instance by
retrieving it as an attribute named jakarta.websocket.server.ServerContainer
on the ServletContext, see
the following example for annotated endpoint:
Example 3.2. Deployment of Annotated Endpoint Using ServerContainer
@WebListener @ServerEndpoint("/annotated") public class MyServletContextListenerAnnotated implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { final ServerContainer serverContainer = (ServerContainer) servletContextEvent.getServletContext() .getAttribute("jakarta.websocket.server.ServerContainer"); try { serverContainer.addEndpoint(MyServletContextListenerAnnotated.class); } catch (DeploymentException e) { e.printStackTrace(); } } @OnMessage public String onMessage(String message) { return message; } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { } }