Хранение сеансов веб-сокетов в Redis - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть конечная точка Web Socket Server, развернутая в tomcat следующим образом:

    @ServerEndpoint(value="/alerts/{username}/{sessionId}/{token}",
    decoders = AlertDTODecoder.class, 
    encoders = AlertDTOEncoder.class )
public class AlertWebSocketEndpoint {

    @OnOpen
    public void onOpen(Session session, 
            @PathParam("username") String username, 
            @PathParam("sessionId") String sessionId,
            @PathParam("token") String token) throws IOException {

        String origToken = TokenCacheServiceImpl.getInstance().getToken(username, sessionId);

        if ( origToken == null || !origToken.equals(token)) {           
            session.close();
        }else {    
            AlertSession.getInstance().addUserSession(username, session);
        }
    }

    @OnClose
    public void onClose(Session session, @PathParam("username") String username) throws Exception {    
        AlertSession.getInstance().removeUserSession(username, session);        
        session.close();
    }
}

AlertSession - это одноэлементный класс, в котором я храню кэш сессий.

TokenCacheServiceImpl использует для кэширования токена, соответствующего каждому пользователю в REDIS.

Я не могу сохранить сеанс в REDIS, так как он не является сериализуемым объектом и, следовательно, должен поддерживать его в локальной памяти.Я стараюсь избегать этого, так как я не хочу потерять данные, если сервер будет перезапущен или если я хочу выполнить балансировку нагрузки.

Как это можно получить?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы не сможете хранить произвольные, не serializable объекты без тонны работы.

Но если вы знаете, какие объекты вы уже храните, то вы, безусловно, можете написать свойсобственный сериализатор.Там нет ничего, что говорит, что данные должны быть двоичными.Вы можете использовать XML, JSON или некоторую искусственную систему хранения.

Можете ли вы ограничить свое приложение так, чтобы в нем хранились только определенные типы объектов?Если вы, например, храните только примитивы (ну, их коробочные версии) и коллекции или тому подобное, вы можете сделать это с очень небольшим количеством кода.Если нет, будьте готовы написать больше кода.

Возможно, будет проще изменить код ваших объектов сеанса на Serializable, а затем просто использовать сериализацию Java для выполнения работы.

Обратите внимание, что будущее сериализации Java неопределенно.Очень старый JEP был подан для удаления сериализации, но он был отозван .Более поздние проблемы безопасности побудили некоторых поддержать удаление сериализации из будущих версий Java .Во второй статье конкретно упоминается, что «удаление сериализации является долгосрочной целью и является частью Project Amber », но я не вижу ничего в Project Amber, которое имеет дело с сериализацией ввсе .

Кроме того, некоторые существующие спецификации Java (части Java EE, включая спецификацию сервлета) в значительной степени требуют поддержки для сериализации, так что ... даже если она устарелаЯ не вижу, чтобы это куда-то шло в ближайшее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...