Comments 3
Интересно, я до этого Atmosphere использовал. Во множестве подобных фреймворков почему-то отсутствуют нормальные средства отлавливания событий life-cycle для коннекшна. То есть такую простую вещь как обновляемый список онлайн пользователей приходится реализовывать через одно место. Дело усложняется, если необходимо добавить прозрачный реконнект.
В Spring это более-менее просто реализуется:
Скрытый текст
// допустим храним в памяти
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());
}
}
Спасибо, мне помогло:)
Sign up to leave a comment.
Простая и масштабируемая подписка на события с WebSockets, STOMP, SockJS и Spring Framework 4.0