From the command line do:
git clone https://github.com/CodeIslet/spring-netty-websocket.git
cd spring-boot-netty-websocket
mvn clean package
java -jar service/target/*.jar
{
"mapper": "MAPPER_NAME",
"body": {
... Request body
}
}
{
"stauts": "response status", // (OK, ERROR, BAD_REQUEST)
"identifier": "target identifier",
"message": "message",
"body": "response body",
"time": "response time"
}
Controller class (≒ @RestController of SpringMVC)
@WebSocketController
public class Groupcontroller() {
...
}
Websocket request handler mapping (≒ @RequestMapping of SpringMVC)
@WebSocketController
public class GroupController() {
/**
* Websocket request object
* {
* "mapper": "join",
* "body": {
* "name": "Joe"
* }
* }
*/
@WebSocketRequestMapping(value = "join")
public void join(JoinRequest req, ChannelHandlerContext ctx, CompletableFuture<ResponseEntity> future) {
...
}
/**
* Websocket request object
* {
* "mapper": "leave",
* "body": null (or pass)
* }
@WebSocketRequestMapping(value = "leave")
public void leave(ChannelHandlerContext ctx, CompletableFuture<ResponseEntity> future) {
...
}
}
≒ ControllerAdvice of SpringMVC
@WebSocketControllerAdvice
public class WebSocketExceptionAdvice {
@WebSocketExceptionHandler(throwables = { GroupProcessingException.class })
public ResponseEntity groupProcessingExceptionHandler(GroupProcessingException e) {
return new ResponseEntity(ResponseEntity.ResponseStatus.ERROR, e.getMessage());
}
}
Provides helper methods for websocket control.
MessageFrame object
channelType: GROUP(Channel group), SINGLE(Channel)
destination: group name or channel id
message: websocket message string
data: websocket data body object
- send
- join
- leave
- sendGroup
- joinGroup
- leaveGroup
You can implement and provide a Publisher or Subscriber interface. this example uses the redis pub/sub provider by default.
(client) <--> [LB] <---> server instances <---> pub/sub channel (default: redis)