Как стать автором
Обновить

Комментарии 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());
    }
}
Спасибо, мне помогло:)
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации