2012-03-29 2 views
2

фон:Возможно ли создать новый файл 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.

Любые способы обойти это или я застрял?

ответ

1

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

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

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

UPDATE для 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 
    } 

} 
+0

На самом деле, 'ConfigurationException' брошен на конструктор. И я никогда не перестаю получать исключение, даже если этот файл был удален. Таким образом, реализация моей собственной «FileChangedReloadingStrategy» не поможет напрямую. (В моем случае это Java 6). –

+0

Я считаю, что получение исключения имеет смысл. «FileChangedReloadingStrategy» используется для контроля «изменения файла», что означает, что вы предполагаете, что файл уже существует; поэтому он не сообщает о новом файле, который был сброшен в каталог, потому что раньше он не существовал. Вот почему я считаю, что вам нужна модифицированная версия, назовем ее 'NewFileReloadingStrategy', чтобы поймать событие, в котором новый файл будет удален в каталоге. Поскольку вы используете Java 6, дает ли JNotify возможность выполнить событие нового файла в каталоге? – nobeh

+0

Это имеет смысл теперь - я не понимал, что вы имели в виду раньше. В этот уик-энд я попытаюсь собрать это вместе, чтобы убедиться, что он работает так, как ожидалось. –