@reus

Как сделать одновременную обработку разных в одной транзакции?

Привет. Столкнулся с интересной для меня задачкой связанной с транзакциями, возможно кто-то подскажет.
Задача состоит в том чтобы отследить количество визитов пользователя и длительность визитов.
Есть веб приложение (сейчас на spring). У него есть мини апи с одним контроллером на который стучатся несколько пользователей.
Существуют разные варианты поведения пользователя:
1. Оптимистичный. Пользователь может постучаться и после того как дверь откроется он сможет войти. Для выхода он обязан снова постучаться - замок двери откроется и он после этого выходит.
2. Обычный. При попытке войти/выйти пользователь может постучаться один, два, три раза потом дверь откроется и только после этого на самом деле сможет выйти/зайти.
3. Сложная ситуация. Пользователь "А" может постучаться чтобы зайти, откроектся дверь, а выйдет пользователь "Б" и после этого только "А" зайдет (само собой Б не стучался и как бы нам отследить что он вышел не постучав).
4. Жизнь боль. Пользователь может постучаться - откроется дверь, он заходит шатаясь то выходя, то входя, но в конце в концов он скорее всего зайдет (тоже поведение при выходе). При этом нужно в визит сохранить первый "вход" и последний "выход" пользователя.

Проблемма в том что каждый реквест приходит в новом потоке (servlet-api без асинхронщины) и каждый реквест обрабатывается в сервисе особым "образом" в одной транзакции и в конце концов создается "визит" и привязывается к нему запись с входом/выходом пользователя. Есть ли рекомендации, как сделать так чтобы при обработке реквестом все пользовательские шарканья привязывались к визиту и при этом не создавали лишних визитов и не занимаясь пост обработкой визитов (например каждые 5 мин. кварцем или аналогом)?

Заранее прошу прощение за "много букв"
  • Вопрос задан
  • 165 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Cr2ed
А с клиента слать сообщение о том что я(пользователь) зашел и я еще активен не вариант?
Если забыл выйти, то такое сообщение не прилетит.
Ответ написан
Комментировать
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
На счет длительности визитов, тут сильно не посоветую. А вот за количество визитов, пожалуйста.
При первом заходе на сайт, ставите ему суперкуку, на месяц например, или на год.
1) Читаем суперкуку, или генерируем ее, если таковой не оказалось
2) Во все логи пробрасываем эту суперкуку.
3) При обработке логов ищем объект с этой суперкукой и наполняем его информацией, кто, когда, под каким именем. каким браузером или клиентом и т.д, Связываем пользователя с суперкукой.
Другими словами, у нас есть и суперкука и пользователь, и здесь не важно, зашел он в систему, вышел, перешел куда-то и т.д.

PS. На счем времени пребывания на сайте, сделайте ajax-таймер, который отрабатывает 5, 10, 30 сек и 1, 3, 5 мин, стучась на эндпоинт, а суперкука будет в комплекте с запросом. Таким способом даже ботов ловить можно, которые без JS работают (которые с JS тоже ловятся),
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы