Наши портлеты сохраняют состояние в HttpSession, который используется всеми потоками обработки запросов для одного и того же сеанса.
Спецификация портлета (JSR-168) записывает:
PLT.5.2.4.3 Проблемы многопоточности при обработке запросов
Контейнер портлета обрабатывает параллельные запросы к одному и тому же портлету путем одновременного выполнения методов обработки запросов в разных потоках.Разработчики портлетов должны спроектировать свои портлеты так, чтобы они обрабатывали одновременное выполнение из нескольких потоков из методов processAction
и render
в любое конкретное время.
Интересно, как я должен этого достичь?Конечно, я могу использовать синхронизацию для достижения взаимного исключения как в processAction
, так и в render
, но я не понимаю, как можно обеспечить атомарность обработки запросов в целом.В частности, меня беспокоит следующий сценарий:
- Поток 1 выполняет
processAction
, загружая данные в сеанс для последующего рендеринга - Поток 2 выполняет
processAction
, отбрасывая эти данныеиз сеанса - Поток 1 выполняет
render
, считывая данные для рендеринга из сеанса, и выдает исключение NullPointerException, поскольку подготовленных данных больше нет ...
Какэтот сценарий обычно предотвращается?В частности, при использовании моста портлета JBoss для адаптации JSF к среде портлета?