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) {
}
}