Создание нескольких чатов в AbstractWebSocketHandler при ловке через WebSocketConfigurer
У меня есть WebSocket который получает сообщение и отправляет его всем подписанным пользователям
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
private final MessageRepo messageRepo;
@Autowired
public WebSocketConfig(MessageRepo messageRepo) {
this.messageRepo = messageRepo;
}
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(WebSocketHandler.getWebSocketHandler(messageRepo),"/messages-update");
}
}
public class WebSocketHandler extends AbstractWebSocketHandler {
private static WebSocketHandler webSocketHandler;
private MessageRepo messageRepo;
private JsonAdapter<SendMessage> adapter;
// private JsonAdapter<Message> adapterMessage;
private Set<WebSocketSession> clients;
public WebSocketHandler(MessageRepo messageRepo) {
this.messageRepo = messageRepo;
Moshi moshi = new Moshi.Builder()
.add(new DataAdapter())
.build();
adapter = moshi.adapter(SendMessage.class);
clients = new HashSet<>();
}
public static WebSocketHandler getWebSocketHandler(MessageRepo messageRepo)
{
if (webSocketHandler == null)
{
webSocketHandler = new WebSocketHandler(messageRepo);
}
return webSocketHandler;
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
clients.add(session);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
clients.remove(session);
}
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
SendMessage messagePayload = adapter.fromJson(message.getPayload());
if (messagePayload == null) return;
Message messageModel = messagePayload.getMessage();
synchronized (this) {
if (messagePayload.getSendId() == 1) {
messageModel.setDateTime(LocalDateTime.now());
messageRepo.save(messageModel);
send(messagePayload);
}
else if (messagePayload.getSendId() == 2) {
messageRepo.save(messageModel);
}
else if (messagePayload.getSendId() == 3) {
messageRepo.delete(messageModel);
}
send(messagePayload);
}
}
void send(SendMessage message)
{
clients.forEach(it ->
{
try {
it.sendMessage(new TextMessage(adapter.toJson(message)));
} catch (IOException e) {
e.printStackTrace();
}
});
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
session.sendMessage(new TextMessage(exception.getMessage()));
}
}
Так сказать, у меня есть общий чат, но я хочу сделать индивидуальный для определенной группы пользователей, Не использую подход со STORM, потому что приложение под Android, а он его не официальной библиотеки для его поддержки нет