Я не проверил ваш код тщательно, но, похоже, проблема с параллелизмом. Карта является поточно-небезопасной (HashMap), поэтому, если вы изменяете ее через config () и у других потоков есть карта доступа, у вас есть проблема.
Хотя вы можете использовать ConcurrentHashMap
вместо HashMap
, пакетная операция на ConcurrentHashMap
не является атомарной. Это означает, что, если вы используете его, вы увидите «наполовину» модифицированный конфиг. Это не может быть хорошо в зависимости от вашего приложения.
Итак, решение для этого заключается в использовании этого:
private volatile ImmutableMap map;
public config(){
ImmutableMap newMap = createNewMap();
this.map = newMap;
}
Это изменит ваши конфиги атомарно (промежуточное состояние не видно).
Что касается обновления вашей конфигурации на лету, log4j делает это с помощью фонового потока, который контролирует файл конфигурации. Вы можете, конечно, контролировать таблицу БД, периодически опрашивая ее.
В этом случае ваш класс Config будет предпочтительно иметь ScheduledExecutor с задачей, которая будет периодически отслеживать файлы / db и вызывать config ().