Я столкнулся с проблемой хранения данных в фоновом сеансе в приложении 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 в качестве сессионного компонента области действия и его внедрением?)
Я был бы очень признателен за любые объяснения и / или советы по этот случай:)