Как отследить, что пользователь перестал выполнять задачу?
Приложение на стеке Spring Boot, для хранения сессий используется Spring Session и Redis.
Есть пользователь. Он может начать проходить тест. Тест проходится в постоянном взаимодействии с сервером: пользователь получает вопрос, отправляет на сервер ответ и получает следующий вопрос. Когда тест кончится, надо записать результаты в БД. Пока тест не завершён, ответы пользователя должны храниться в сессии (сессия, напоминаю, хранится в Redis).
Пользователь может прервать тест, в частности:
- Закрыть вкладку
- Перейти по другому адресу со страницы теста
- Нажать кнопку "Отменить тест"
- Перезагрузить страницу
В этих случаях надо обнулять уже данные пользователем ответы, то есть откатывать тест. Для решения этой задачи мне на ум приходит только пингование, но и его с трудом понимаю, как его реализовать. Сессии, напоминаю, хранятся не в памяти, а в Redis.
Вопрос: как сделать сброс теста?
Ответы (1 шт):
Решение нашлось довольно простое.
Когда тест создаётся, я генерирую уникальный ключ, по которому данные теста сохраняются в Redis. Этот же ключ я возвращаю клиенту, где он сохраняется в state. Когда клиент хочет дать ответ на следующий вопрос, то помимо самого ответа на сервер отсылается ещё и ключ из state. Redis при помощи этого ключа пытается найти запись с данными теста и, если запись отсутствует, возвращает ошибку.
После каждого запроса ключ обновляется (это нужно, чтобы сбрасывать TTL записи в Redis). Если пользователь закрывает вкладку / обновляет её, то state затирается, ключ исчезает, а с ним клиент теряет доступ к тесту. Поэтому пользователь вынужден начинать тест с самого начала.