Какие-либо преимущества безопасности потока, связанные с представлением веб-службы в качестве сеансового компонента без сохранения состояния?
Существуют ли какие-либо преимущества, связанные с безопасностью потоков, при представлении веб-службы в качестве сеансового компонента без сохранения состояния?
(Поправьте меня, если я ошибаюсь), но я думаю, что веб-сервисы не являются потокобезопасными и, как и сервлеты, только один экземпляр класса веб-сервисов создается сервером (не один экземпляр на запрос).
Что я не знаю, назначаются ли они из пула bean-компонентов, таких как bean-компоненты без состояния, сервером приложений. Я пытаюсь выяснить, использую ли я аннотацию @Stateless с веб-службой, уже аннотированной аннотацией @WebService, - заставит ли сервер приложений начать назначать их из пула для каждого входящего запроса. Таким образом, я точно знаю, будет ли создан отдельный экземпляр для каждого входящего запроса?
1 ответ
Вступление
Количество экземпляров, используемых конечной точкой веб-службы, зависит от используемой платформы.
Если вы используете простую конечную точку (например, JAX-WS с веб-сервисами Apache CXF или Spring), у вас будет один экземпляр службы для всех потоков / запросов (как вы сказали, сервлеты). Таким образом, по определению, этот вид услуг предназначен для лиц без гражданства. Но если вам нужно добавить какое-либо состояние в службу, вы можете это сделать, но разработчик должен сделать поток службы безопасным.
Когда вы используете EJB, у вас больше гибкости: если вы используете bean-компоненты без сохранения состояния, у вас будет пул экземпляров для управления всеми запросами (если ваш poolSize=1, вы получите то же поведение Apache CXF). Опять же, вы можете добавить некоторое состояние в bean-компонент без состояния, но сделать его безопасным для потоков еще сложнее, потому что у вас есть пул экземпляров для управления. Но если вам нужно состояние, вы можете использовать bean-компонент с состоянием, чтобы создать среду, которая облегчит вашу жизнь с точки зрения безопасности потоков.
Некоторые подсказки относительно состояний обслуживания
Если вы не сохраняете состояние в вашем сервисе, ваш веб-сервис является поточно-ориентированным. Другими словами, сервис без сохранения состояния, если поток безопасен по определению.
Если вам нужно какое-то состояние, которое должно делиться ВСЕМ потоком / запросом, вы можете добавить некоторое состояние в службу без состояния (JAX-WS или сессионный компонент без сохранения состояния с poolSize=1), но вам нужно сделать его потокобезопасным, добавив блоки sycn (пожалуйста, не синхронизируйте @WebMethod
). ВАЖНО: Теоретически (и на практике) вы НИКОГДА не должны добавлять состояние в сессионный компонент без сохранения состояния, поскольку пул может уничтожать / создавать экземпляры, когда он "хочет".
Если вам нужно сохранить состояние, которое будет использоваться только текущим потоком / запросом, вы можете добавить некоторое состояние в службу без сохранения состояния, используя ThreadLocal
переменные, или более просто, используя сессионные компоненты с состоянием.
Теперь, наконец, отвечаю на ваш вопрос
- Сессионные компоненты без сохранения состояния являются потокобезопасными, если и только если вы сделаете их потокобезопасными: они не должны иметь состояния:-)
- Единственное отличие между классической веб-службой и веб-службой сессионного компонента без сохранения состояния, если первая будет иметь один экземпляр, а вторая будет использовать пул экземпляров. Если ваш poolSize=1, вы получите тот же эффект, но теоретически пул может уничтожить ваш экземпляр, когда он "захочет".
Надеюсь, это поможет,