Как получить / изменить все пользовательские сессии из bean-компонента Spring @Service (используя Struts mvc)? - PullRequest
0 голосов
/ 11 сентября 2018

Я внедряю сервис уведомлений, который уведомляет всех пользователей (с активными сеансами) о новых уведомлениях.Поскольку в этом веб-приложении используется Struts MVC (а не одностраничное приложение), использование веб-сокета представляется нецелесообразным, поскольку при каждой загрузке страницы требуется новое подключение WS.Вместо этого мой подход состоял в том, чтобы запускать Spring @Service каждую минуту, чтобы обновлять все сеансы активных пользователей с помощью «Unread_Notification_Count», чтобы каждая загрузка страницы могла просто проверять сеанс пользователя на это значение и соответствующим образом изменять отображение (исключая запрос к базе данных для каждогозагрузка страницы).

У меня есть 2 вопроса: 1) Является ли это лучшим подходом для решения этой проблемы, как я прочитал в документации Spring, что вам следует избегать непосредственного изменения пользовательских сессий.2) Если этот подход «хорошо», то как мне получить доступ к каждому сеансу пользователей, чтобы вставить / изменить значение «Unread_Notification_Count»?

@Service("notifySessionsService")
public class NotifySessionsServiceImpl implements NotifySessionsService {

    @Autowired
    private transient SessionRegistry sessionRegistry;

    @Override
    public void updateUnReadNotificationCount() {

        for (Object principal : sessionRegistry.getAllPrincipals()) {
            List<SessionInformation> sessionInformationList = sessionRegistry.getAllSessions(principal, false);
            for (SessionInformation sessionInformation : sessionInformationList) {
                System.out.println("Updating session for user: "  + ((User)principal).getUsername() + ", sessionId: " + sessionInformation.getSessionId());
                // [Get users notification count here]
                // [Put in session, e.g. session.put("Unread_Notification_Count", count)]
            }
        }

    }

    public void setSessionRegistry(SessionRegistry sessionRegistry) {
        this.sessionRegistry = sessionRegistry;
    }
}

1 Ответ

0 голосов
/ 13 сентября 2018

Андрей, спасибо за идею. Я закончил тем, что выбрал версию javascript / client pull. Просто для закрытия мой код закончился как код ниже. Клиент проверяет уведомления каждые 5 минут (по часам - не по таймеру)

var queryNotificationsEvery = 5; // in minutes

function startNotificationService(appUserId) {
    // Check each minute to see if we need to query for notifications
    setInterval(queryNotificationCount, 1000 * 60, appUserId)
}

function queryNotificationCount(appUserId) {

    var currentMinute = new Date().getMinutes();
    if (currentMinute % queryNotificationsEvery === 0) {

        // Query server via AJAX
        var notificationCount = queryServer(appUserId);

        // Change UI
        changeUINotifications(notificationCount);
    }

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