Как Домены glassfish отделены друг от друга?
GlassFish позволяет создавать N доменов. Каждый домен имеет свои собственные классы Java (библиотеки и т. д.) и системные настройки.
например, у нас есть два домена - domain1 и domain2.
через веб-консоль GF (http://localhost:4848) для domain1 было установлено одно системное свойство -com.temp.foo=test1
. Кроме того, через веб-консоль GF (http://localhost:7575) для domain2 было установлено одно системное свойство -com.temp.foo=test2
.
теперь, в domain1
System.out.println(System.getProperty("org.temp.foo"))
//returns `test1`
и в domain2
System.out.println(System.getProperty("org.temp.foo"))
//returns `test2`
как я понимаю, GF и все его Домены работают в одном экземпляре JVM. И я не понимаю, как это возможно в одном экземпляре отдельных системных свойств JVM. Кто-нибудь может объяснить?
примечание: Я понимаю, что это может быть очень длинное объяснение, поэтому я спрашиваю только о главном принципе и именах решений/библиотек в порядке, я мог бы прочитать о них в интернете.
2 ответов
кажется, что понимание "GF и все его Домены работают в одном экземпляре JVM" неверно.
согласно текущей версии GlassFish документация (Глава 3):
домен содержит группу администрируемых экземпляров сервера GlassFish вместе. [...] Экземпляр сервера GlassFish-это одна виртуальная машина для платформы Java (Java Виртуальная машина или машина JVM) на одном узле, в котором находится сервер GlassFish бегущий.
, Что значит каждый экземпляр любого домена работает в своем собственном JVM! Как следствие, все они могут иметь свои собственные различные свойства системы.
справедливости ради: есть средства для администрирования виртуальные серверы в GlassFish, которые, кажется, разделяют JVM, но я думаю, что вы не говорите о них.
такие продукты, как GlassFish, JBoss, WebSphere,... "просто" используйте Java загрузка класс механизм для создания изоляции. Используя несколько загрузчиков классов, даже a static поля класса могут существовать "более одного раза"; и каждый" домен " получает свою особую версию этого.
начать чтение здесь или здесь например:
Application Universe-каждое приложение Java EE имеет свой собственный Вселенная загрузчика классов, которая загружает классы во все модули приложения.
и за этим, посмотрите в этой.
другими словами: хотя системный класс, очевидно, представляет собой "системный вид" - механизм загрузки класса должен позволить дать разные экземпляры системного класса для каждого домена. Таким образом, это позволяет иметь доменные свойства в каждом доменном системном классе. Но будьте точны: я не смог найти четких доказательств, подтверждающих это утверждение. На эту тему здесь и здесь должен помочь (более поздний, указывающий, что есть даже способы вмешиваться в система загрузчика).
но, думая дальше, есть проблема с этой идеей: на самом деле два механизмы загрузки классов. Есть загрузчики класса "система / пользователь"... и начальный загрузчик загрузчиком.
и загрузчик классов bootstrap фактически "запечен" в JVM (например, он реализован в собственном коде) - и это не может быть заменить.
и java.ленг.Система должна быть загружена этим загрузчиком классов bootstrap!
Так невозможно использовать " classloader magic "для включения системных свойств" для каждого домена"!
другой вариант, который я вижу, - создать агент Java, который перехватывает вызовы и манипулирует их результатом (см. здесь в качестве отправной точки).
но, опять же; агенты приходят "после" загрузки завершены!
Итак, единственный логический вывод (принимая то, что осталось после исключения всех вариантов): посылка вопроса должна быть неправильной!
Это просто невозможно это разные "приложения", работающие на то же самое JVM дают различные системные свойства. И, к счастью, великий ответ Seelenvirtuose подтверждает этот вывод.