Можно ли предоставить новый файл PropertiesConfiguration во время выполнения? - PullRequest
2 голосов
/ 29 марта 2012

Справочная информация:

У меня есть требование, чтобы сообщения, отображаемые пользователю, различались в зависимости от языка и подразделения компании.Таким образом, я не могу использовать готовые комплекты ресурсов, поэтому я пишу свою собственную версию комплектов ресурсов, используя файлы PropertiesConfiguration.

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

Я загружаю три разных итерации файлов свойств:

-basename_division.properties
-basename_2CharLanguageCode.properties
-basename.properties

Эти файлы существуют в пути к классам.Этот код входит в библиотеку тегов, которая будет использоваться несколькими портлетами в портале.

Я создаю возможные файлы .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 в хэш-карту для повторного использования, а затем пытается найти ключ.(В отличие от обычных пакетов ресурсов, если он не находит ключ, он затем пытается найти более общий файл, чтобы посмотреть, существует ли ключ в этом файле - так что только специфические для переопределения исключения должны быть помещены в специфичное для языка / подразделения свойствофайлы.)

Проблема:

Если файл не существовал при первой проверке, он вызывает ожидаемое исключение.Тем не менее, если позднее файл затем будет добавлен в путь к классам, а затем этот код будет перезапущен, исключение все равно будет сгенерировано.Перезапуск портала, очевидно, устраняет проблему, но для меня это бесполезно - мне нужно иметь возможность разрешить им сбрасывать новые сообщения для переопределения language / companyDivision без перезапуска.И я не очень заинтересован в создании пустых файлов для всех возможных подразделений, так как делений довольно много.

Я предполагаю, что это проблема classLoader, поскольку она определяет, что файл не существуетв пути к классам в первый раз, и кешируются в результате при попытке перезагрузить тот же файл.Я не заинтересован в том, чтобы делать что-то слишком причудливое с classLoader.(Я был бы единственным, кто смог бы понять / поддерживать этот код.) Конкретной средой является WebSphere Portal.

Есть какие-то способы обойти это или я застрял?

1 Ответ

1 голос
/ 29 марта 2012

Я предполагаю, что я не уверен, что Apache FileChangedReloadingStrategy также сообщает о событиях ENTRY_CREATE в каталоге файловой системы.

Если вы используете Java 7, я предлагаю попробовать следующее. Просто внедрите новый ReloadingStrategy, используя Java 7 WatchService. Таким образом, каждый раз, когда файл изменяется в целевых каталогах или помещается новый файл свойств, вы poll для события и можете добавлять свойства в ваше приложение.

Если бы не Java 7, возможно, использование библиотеки, такой как JNotify , было бы лучшим решением для получения события новой записи в каталоге. Но опять же, вам нужно реализовать ReloadingStrategy.

ОБНОВЛЕНИЕ для Java 6:

PropertiesConfiguration configurationProperties;
try {
    configurationProperties = new PropertiesConfiguration(propertyFileName);
    configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
} catch (ConfigurationException e) {
    JNotify.addWatch(propertyFileDirectory, JNotify.FILE_CREATED, false, new FileCreatedListener());
}

где

class FileCreatedListener implements JNotifyListener {
  // other methods

  public void fileCreated(int watchId, String rootPath, String fileName) {
    configurationProperties = new PropertiesConfiguration(rootPath + "/" + fileName);
    configurationProperties.setReloadingStrategy(new FileChangedReloadingStrategy());
    // or any other business with configurationProperties
  }

}
...