Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
// допустим храним в памяти
interface SomeInMemoryStorage {
Collection<Principal> getActivePrincipals();
void connectPrincipal(Principal principal);
void disconnectPrincipal(Principal principal);
}
// какой-то storage
@Service
class SomeInMemoryStorageImpl implements SomeInMemoryStorage {
@Override
public void connectPrincipal(Principal principal) {
// восстанавливаем предыдущее состояние
}
@Override
public Collection<Principal> getActivePrincipals() {
return new ArrayList<>(0);
}
@Override
public void disconnectPrincipal(Principal principal) {
// можем сохранить состояние
}
}
public class LifecycleStompWebSocketHandler extends StompWebSocketHandler {
private static final Log logger = LogFactory.getLog(LifecycleStompWebSocketHandler.class);
private SomeInMemoryStorage someInMemoryStorage;
public LifecycleStompWebSocketHandler(SomeInMemoryStorage storage, MessageChannel dispatchChannel) {
super(dispatchChannel);
this.someInMemoryStorage = storage;
}
// переопределяем пару методов
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
super.afterConnectionClosed(session, status);
logger.debug("Principal disconnected: " + session.getPrincipal().getName());
someInMemoryStorage.connectPrincipal(session.getPrincipal());
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
super.afterConnectionEstablished(session);
logger.debug("Principal connected: " + session.getPrincipal().getName());
someInMemoryStorage.disconnectPrincipal(session.getPrincipal());
}
}
Простая и масштабируемая подписка на события с WebSockets, STOMP, SockJS и Spring Framework 4.0