фон:Возможно ли создать новый файл PropertiesConfiguration во время выполнения?
У меня есть требование, что сообщения, отображаемые пользователю должны отличаться как по языку и деление компании. Таким образом, я не могу использовать из пакетных пакетов ресурсов, поэтому я, по сути, пишу собственную версию пакетов ресурсов, используя файлы PropertiesConfiguration.
Кроме того, у меня есть требование, чтобы сообщения динамически изменялись в процессе производства без перезапуска.
я загружаю три различных итерации файлов свойства:
-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties
Этих файлы существуют в пути к классам. Этот код входит в библиотеку тегов, которая будет использоваться несколькими портлетами в Portal.
я построить возможные .properties файлы, а затем попытаться загрузить каждый из них с помощью следующих действий:
PropertiesConfiguration configurationProperties;
try {
configurationProperties = new PropertiesConfiguration(propertyFileName);
configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
/* This is ok -- it just means that the specific configuration file doesn't
exist right now, which will often be true. */
return(null);
}
Если она успешно найти файл, он сохраняет созданный PropertiesConfiguration в HashMap для повторного использования, а затем пытается найти ключ. (В отличие от обычных пакетов ресурсов, если он не находит ключ, он затем пытается найти более общий файл, чтобы узнать, существует ли ключ в этом файле - так что только исключения переопределения должны быть помещены в свойство специфического языка/раздела файлы)
Проблема:.
Если файл не существует в первый раз он был проверен, он выбрасывает ожидаемое исключение. Однако, если позже файл затем будет опущен в путь к классам, и этот код снова будет запущен, исключение все равно будет выбрано. Перезапуск портала, очевидно, устраняет проблему, но мне это не полезно - мне нужно разрешить им добавлять новые сообщения для переопределения языка/companyDivision без перезапуска. И я не заинтересован в создании пустых файлов для всех возможных разделов, так как существует довольно много делений.
Я предполагаю, что это проблема классаLoader, поскольку он определяет, что файл не существовал в пути к классам в первый раз, и кэширует этот результат при попытке перезагрузить один и тот же файл. Мне не интересно делать что-то слишком необычное с classLoader. (Я был бы единственным, кто мог бы понять/поддерживать этот код.) Конкретной средой является WebSphere Portal.
Любые способы обойти это или я застрял?
На самом деле, 'ConfigurationException' брошен на конструктор. И я никогда не перестаю получать исключение, даже если этот файл был удален. Таким образом, реализация моей собственной «FileChangedReloadingStrategy» не поможет напрямую. (В моем случае это Java 6). –
Я считаю, что получение исключения имеет смысл. «FileChangedReloadingStrategy» используется для контроля «изменения файла», что означает, что вы предполагаете, что файл уже существует; поэтому он не сообщает о новом файле, который был сброшен в каталог, потому что раньше он не существовал. Вот почему я считаю, что вам нужна модифицированная версия, назовем ее 'NewFileReloadingStrategy', чтобы поймать событие, в котором новый файл будет удален в каталоге. Поскольку вы используете Java 6, дает ли JNotify возможность выполнить событие нового файла в каталоге? – nobeh
Это имеет смысл теперь - я не понимал, что вы имели в виду раньше. В этот уик-энд я попытаюсь собрать это вместе, чтобы убедиться, что он работает так, как ожидалось. –