Конфигурация программы обновления Java - PullRequest
0 голосов
/ 15 июля 2011

У меня есть многопоточная программа, которая загружает свою конфигурацию при запуске. Затем конфигурация передается потокам через их конструкторы.

Но теперь я хочу регулярно загружать один новый экземпляр конфигурации и передавать его потокам.

Одной из идей было бы сделать ссылку в классе потока на файл конфигурации энергозависимой. Затем, когда будет доступен обновленный экземпляр конфигурации, вызовите метод обновления update(Config c).

Это путь? У меня будет ужасная производительность, потому что каждый раз, когда потоку нужно что-то настраивать, он должен выполнять всю эту нестабильную проверку.

Некоторые лучшие предложения? Лучшая практика? Может, не сделать его нестабильным и надеяться, что процессор время от времени извлекает этот новый объект из основной памяти?

Ответы [ 4 ]

3 голосов
/ 15 июля 2011

Вы можете инкапсулировать все ваши значения конфигурации в один неизменный объект, и при изменении конфигурации создать новый экземпляр объекта и передать его потокам через слушателей или явный вызов. У объекта нет полей volatile, в переменную volatile (или AtomicReference) можно записать только сам объект.

Прямой volatile подход без других механизмов синхронизации опасен: вы можете прочитать переписанную наполовину конфигурацию.

В любом случае влияние на производительность вашего приложения, вероятно, будет незначительным. Подумайте об оптимизации позже, если вы обнаружите, что это действительно узкое место.

2 голосов
/ 15 июля 2011

На самом деле, вы уверены, что у вас будет ужасная производительность?

Если volatile используется в основном для чтения, его производительность не так уж и плоха.Я бы порекомендовал сначала попробовать volatile и измерить снижение производительности и только в том случае, если это важно, затем выполнить какие-либо переделки .

Если вы действительно беспокоитесь о быстрых энергозависимых чтениях - тогда при запускеВы можете проверить тайм-аут - если прошло 60 секунд с момента последнего чтения конфигурации - перечитайте его.Логика изменится с update(Config c) на

if(moreThan60SecondsPassed)
{
localConfig = configconfigHolder.getConfig();
}

Кроме того, если вы будете использовать энергонезависимый - вы не получите половину прочитанного конфига.Опасность заключается в том, что некоторые потоки могут не видеть обновленное значение вечно (без отношения «происходит до»).

Bw, вы рассматривали воссоздание потоков при обновлении конфигурации?В этом случае вы все еще можете передать config через конструктор.Это зависит от того, как часто вы хотите обновить конфигурацию.

0 голосов
/ 15 июля 2011

Возможно, вы захотите взглянуть на Общая конфигурация :

Общая проблема с конфигурациями на основе файлов заключается в обработке перезагрузки файла данных при его изменении.Это особенно важно, если у вас давно запущенные приложения и вы не хотите перезапускать их при обновлении файла конфигурации.Конфигурация Commons имеет концепцию так называемых стратегий перезагрузки, которые могут быть связаны с конфигурацией на основе файлов.Такая стратегия отслеживает файл конфигурации и способна обнаруживать изменения.Стратегия перезагрузки по умолчанию - FileChangedReloadingStrategy.Его можно настроить для файловой конфигурации следующим образом.

ManagedReloadingStrategy является альтернативой автоматической перезагрузке.Это позволяет перезагрузить свойства в запущенном приложении, но только по запросу администратора.Метод refresh () приведет к перезагрузке источника конфигурации.

0 голосов
/ 15 июля 2011

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

Нет способа избежать изменчивых проверок. Возможно, это дорого (проведите несколько тестов производительности), но ваша программа будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...