Портлеты, HttpSession и Thread-Safety - PullRequest
4 голосов
/ 23 марта 2011

Наши портлеты сохраняют состояние в HttpSession, который используется всеми потоками обработки запросов для одного и того же сеанса.

Спецификация портлета (JSR-168) записывает:

PLT.5.2.4.3 Проблемы многопоточности при обработке запросов

Контейнер портлета обрабатывает параллельные запросы к одному и тому же портлету путем одновременного выполнения методов обработки запросов в разных потоках.Разработчики портлетов должны спроектировать свои портлеты так, чтобы они обрабатывали одновременное выполнение из нескольких потоков из методов processAction и render в любое конкретное время.

Интересно, как я должен этого достичь?Конечно, я могу использовать синхронизацию для достижения взаимного исключения как в processAction, так и в render, но я не понимаю, как можно обеспечить атомарность обработки запросов в целом.В частности, меня беспокоит следующий сценарий:

  • Поток 1 выполняет processAction, загружая данные в сеанс для последующего рендеринга
  • Поток 2 выполняет processAction, отбрасывая эти данныеиз сеанса
  • Поток 1 выполняет render, считывая данные для рендеринга из сеанса, и выдает исключение NullPointerException, поскольку подготовленных данных больше нет ...

Какэтот сценарий обычно предотвращается?В частности, при использовании моста портлета JBoss для адаптации JSF к среде портлета?

1 Ответ

1 голос
/ 23 марта 2011

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

Возможно, вы захотите сохранить данные для каждого портлета / потока, т. Е. Если portlet1 считывает некоторые данные, вы должны записать их блокировку до завершения чтения и поместить их в сеанс с использованием уникального ключа.* Если законно удалить данные, которые должны быть предоставлены, то вам следует учесть это и проверить еще раз во время render.

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