Что происходит, когда я внедряю компонент без состояния в компонент с сохранением состояния? - PullRequest
0 голосов
/ 07 мая 2018

Я работаю над большой монолитной веб-системой Java, созданной на основе JSF 1.1 и Seam Framework, на сервере jBoss.

У меня есть базовый компонент JSF (с сохранением состояния по умолчанию в JSF), который внедряет компонент без сохранения состояния, используемый в качестве службы (и помеченный @Stateless). Служба без сохранения состояния имеет переменную-член экземпляра, объявленную как List и увеличенную методом.

Issue: После обновления версии jBoss с 5.1 EAP до 7.0 указанная переменная (список) принимает значения из других запросов. Это создает ошибку в системе. Но переменная находится внутри службы без сохранения состояния. Почему это происходит? Что должно происходить в этой ситуации?

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

Редактировать: Pproblem решен, я работал с jBoss 5 и Seam Framework несколько лет. Я был смущен неправильным составом jBoss 5. После прочтения определения для Steteless Bean я очень хорошо понимаю, что происходит с моим кодом: [Учебник по Java EE 1.4 1

После обновления до jBoss 7 пул bean-компонентов без сохранения состояния работает как положено, и системный код выдает ошибку из-за плохой реализации моей команды (bean-компоненты без сохранения состояния с таким большим количеством глобальных переменных). Когда пул jBoss начал работу, значения начали передаваться другим запросам.

1 Ответ

0 голосов
/ 07 мая 2018

Это потому, что ваш экземпляр без сохранения состояния используется несколькими экземплярами с состоянием.

Переменные-члены компонентов без сохранения состояния почти ведут себя как глобальные переменные во время выполнения.Итак: - если ваш список зависит от состояния, поместите его в компонент с сохранением состояния - в противном случае оставьте его как есть, но с помощью механизма очистки - третий способ быть «сохраняющим состояние в состоянии без состояния», но только на веб-серверах, заключается в использовании переменных ThreadLocal

...