Хранение форм в фоновом сеансе при одновременном доступе - PullRequest
0 голосов
/ 24 марта 2020

Я столкнулся с проблемой хранения данных в фоновом сеансе в приложении Springboot (2.0.5). Это приложение связано с фронтом Angular 8, который представляет несколько форм подряд. Поскольку базы данных нет, бизнес-контекст хранится в сеансе с RequestContextHolder, который можно обобщить следующим образом:

public void init() {
    CustomContext customContext = new CustomContext(); // initialize business context, called one time at init
    RequestContextHolder.getRequestAttributes().setAttribute("CUSTOM_CONTEXT", customContext, RequestAttributes.SCOPE_SESSION); // store in session
}

public void process(InputData inputData) { // called from controller when a form is submitted
    CustomContext customContext = RequestContextHolder.getRequestAttributes().getAttribute("CUSTOM_CONTEXT", RequestAttributes.SCOPE_SESSION); // get from session
    process(inputData, customContext); // process inputData, different implementation depending on step and customContext is updated

}

Проблема возникает, когда несколько форм отправляются одновременно (разные пользователи, браузеры. ..).

Допустим, объект customContext имеет атрибут даты. Если 2 пользователя отправляют форму, которая обновляет дату одновременно (в совершенно ином бизнес-контексте), один с 2020-03-24, а другой с 2020-03-22, я вижу, что первый customContext хорошо настроен с значение 2020-03-24, но когда метод процесса вызывается во второй раз, customContext уже имеет значение 2020-03-24, когда оно получено, и в конце оба объекта customContext содержат значение 2020-03 -22.

Я указываю, что в этом сценарии session / sessionID являются разными.

Я не понимаю, почему я получаю этот результат, так как RequestContextHolder должен быть потокобезопасным. С другой стороны, я не полностью убежден, что использование RequestContextHolder является лучшим практическим вариантом здесь (по сравнению с объявлением CustomContext в качестве сессионного компонента области действия и его внедрением?)

Я был бы очень признателен за любые объяснения и / или советы по этот случай:)

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