JBoss/EJB — расположение пользовательского файла конфигурации

Я реализую систему на основе EJB в JBoss.

Один из моих bean-компонентов, управляемых сообщениями, будет отвечать за отправку электронных писем. Я хочу, чтобы шаблон электронной почты хранился извне (возможно, в виде XML), чтобы его можно было легко изменить без необходимости изменения кода/повторного развертывания bean-компонента и т. д.

Где должен быть размещен этот файл и как я могу сослаться на него?


person William    schedule 29.07.2009    source источник
comment
Обратите внимание, что не разрешено получать доступ к произвольным файлам из EJB (см. Как получить доступ к файловой системе из EJB 3). С моей точки зрения, ответ @duffymo - лучший выбор (хранить шаблон в базе данных). В качестве альтернативы вы можете использовать JNDI, как указано в ответе на связанный вопрос.   -  person Filou    schedule 19.12.2019


Ответы (3)


В документации JBoss указано, что переменная среды jboss.server.data.dir является «местоположением, доступным для использования службами, которые хотят хранить содержимое в файловой системе». Подробнее см. здесь. Вы можете получить значение переменной с помощью

System.getProperty("jboss.server.data.dir");

И, как показано в ссылке, будет возвращено расположение каталога server/[config]/data. Сохраните там файл шаблона при развертывании приложения и попросите администраторов изменить его там.

person Armadillo    schedule 06.08.2009
comment
Только что попробовал это успешно. Это кажется лучшим решением для нас прямо сейчас, однако я немного сбит с толку, поскольку думал, что доступ к файловой системе противоречит спецификации EJB? - person William; 06.08.2009
comment
Кроме того, вызовет ли это проблему, если мы доберемся до этапа, когда нам нужно будет запускать несколько серверов JBoss в кластере, т.е. нужно ли будет дублировать один и тот же файл на каждом из них? Альтернативой, которую я сейчас рассматриваю, является сохранение информации в дереве JNDI, которое кажется более масштабируемым. - person William; 07.08.2009
comment
Да, возникнет проблема с доступом к файловой системе в кластерном развертывании. Я считаю, что в этом случае доступ к файлам слишком упрощен, и предпочтительнее другое решение. Если вы используете систему, которая заслуживает кластерной среды, возможно, вы могли бы подумать о службе конфигурации, которая скрывала бы детали доступа к информации о шаблоне. - person Armadillo; 07.08.2009

Этот вопрос и этот сообщение в блоге см. к файлам свойств, но то, что обсуждается, также применимо и к другим типам файлов. Одним из решений было бы поместить файл XML в стандартное место и прочитать его следующим образом (код взят из приведенной выше ссылки):

String path = System.getProperty("catalina.base")

                  + System.getProperty("file.seperator")

                  + "YOUR_FILE.properties";

FileInputStream fis = new FileInputStream(path);

Вместо catalina.base вы можете использовать user.dir или даже определить свою собственную переменную среды (mypath_to_xml_file) и прочитать ее с помощью System.getProperty.

Другим решением было бы использовать JNDI для определения пути к файлу.

person kgiannakakis    schedule 04.08.2009

Или поместите его в базу данных, откуда вы сможете получить его через клиент SQL. Загрузите его при запуске или, возможно, опросите, чтобы проверить изменения метки времени и перезагрузите его.

Какой шаблон вы имеете в виду? Это шаблон Velocity, который вы заполняете способом слияния?
Что мне нравится в структуре базы данных, так это то, что вы можете добавить в схему гораздо больше информации, чем просто файл. Вы можете включить временную метку, идентификатор пользователя, обновившего шаблон, версию, метаданные, имя системы, логическое значение, указывающее «активный» или «неактивный» и т. д. Ваш EJB может быть очень умным в выборе шаблона. Возможно, у вас будет даже больше возможностей, чем если бы вы просто хранили файлы на диске сервера. Таким образом, они будут доступны и другим приложениям. Может быть хороший дизайн, если вы немного побегаете с ним.

Если вы добавите его в каталог WEB-INF/classes развернутого развертывания, вы можете легко сослаться на него с помощью «getResourceAsStream()». Добавьте функцию опроса, если вы не хотите отбрасывать сервер.

person duffymo    schedule 04.08.2009