Атрибут ServletContex в кластерной среде приложения

У меня есть приложение, развернутое в кластере с двумя серверами. Когда я устанавливаю любой атрибут, используя:

this.getServletContext().setAttribute("test", testObj);
  1. Будет testObj атрибут с ключом test быть доступным для доступа через оба сервера?
  2. Количество серверов равно количеству JVM? В моем случае есть два сервера, значит ли это, что есть два JVM?
  3. Насколько я понимаю, ServletContext - один на веб-приложение на JVM, поэтому в моем случае testObj быть доступным при доступе через обе виртуальные машины?

1 ответ

В соответствии с ServletContext Javadoc:

В случае веб-приложения, помеченного как "распределенное" в его дескрипторе развертывания, для каждой виртуальной машины будет один экземпляр контекста. В этой ситуации контекст не может использоваться как место для обмена глобальной информацией (потому что информация не будет действительно глобальной). Вместо этого используйте внешний ресурс, такой как база данных.

В спецификации сервлета также указано в "Атрибутах контекста SRV.4.4.1 в распределенном контейнере":

Атрибуты контекста являются локальными для JVM, в которой они были созданы. Это не позволяет атрибутам ServletContext быть хранилищем общей памяти в распределенном контейнере. Когда необходимо разделить информацию между сервлетами, работающими в распределенной среде, ее следует поместить в сеанс (см. Главу SRV.7, "Сеансы"), сохранить в базе данных или установить в компоненте Enterprise JavaBeansTM.

Таким образом, ответ на ваш вопрос - нет, атрибут недоступен во всем кластере, он доступен только на локальной JVM.

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

Другие вопросы по тегам