Атрибут ServletContex в кластерной среде приложения
У меня есть приложение, развернутое в кластере с двумя серверами. Когда я устанавливаю любой атрибут, используя:
this.getServletContext().setAttribute("test", testObj);
- Будет
testObj
атрибут с ключомtest
быть доступным для доступа через оба сервера? - Количество серверов равно количеству JVM? В моем случае есть два сервера, значит ли это, что есть два JVM?
- Насколько я понимаю, ServletContext - один на веб-приложение на JVM, поэтому в моем случае
testObj
быть доступным при доступе через обе виртуальные машины?
1 ответ
В соответствии с ServletContext Javadoc:
В случае веб-приложения, помеченного как "распределенное" в его дескрипторе развертывания, для каждой виртуальной машины будет один экземпляр контекста. В этой ситуации контекст не может использоваться как место для обмена глобальной информацией (потому что информация не будет действительно глобальной). Вместо этого используйте внешний ресурс, такой как база данных.
В спецификации сервлета также указано в "Атрибутах контекста SRV.4.4.1 в распределенном контейнере":
Атрибуты контекста являются локальными для JVM, в которой они были созданы. Это не позволяет атрибутам ServletContext быть хранилищем общей памяти в распределенном контейнере. Когда необходимо разделить информацию между сервлетами, работающими в распределенной среде, ее следует поместить в сеанс (см. Главу SRV.7, "Сеансы"), сохранить в базе данных или установить в компоненте Enterprise JavaBeansTM.
Таким образом, ответ на ваш вопрос - нет, атрибут недоступен во всем кластере, он доступен только на локальной JVM.
Что касается количества JVM на сервер, в базовой конфигурации вы можете иметь JVM на физический компьютер, но вы также можете иметь больше JVM на одном компьютере в зависимости от характеристик приложения или если вы хотите максимально использовать свое оборудование.