2017-01-24 3 views
0

У нас уже есть настройки, в которых мы загружаем файлы, такие как:файлы конфигурации загрузки динамически с использованием Spring

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 
    <property name="locations"> 
    <list> 
      <value>file:${AN_ENV_CONFIGURED_DIR}/project.properties</value> 
    </list> 
    </property> 

файлы конфигурации находятся там в сервере в отдельном месте. Я хочу загружать файлы конфигурации динамически, если есть изменения в нем. Теперь, поскольку у меня уже есть эта настройка, есть простой способ перезагрузить конфигурационные файлы из Spring, кроме использования TimerTask, и если это единственный способ, то все равно его не хватает, чтобы сразу загрузить файл.

ответ

1

Вы можете использовать ReloadableResourceBundleMessageSource, Ниже приведен фрагмент кода.

<bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource"> 
    <property name="basenames"> 
    <list> 
     <value>file:${AN_ENV_CONFIGURED_DIR}/project.properties</value> 
    </list> 
    </property> 
    <property name="cacheSeconds" value="1"/> 
</bean> 

Для получения дополнительной информации: http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/support/ReloadableResourceBundleMessageSource.html

+0

Его хороший выбор, но есть п число услуг, и я должен сделать для всех услуг, для которых мы не имеем доступа/не может изменить. Можем ли мы работать на уровне контейнера? – Raghuveer

+0

Здесь мы говорим о том, что файл свойств можно перезагрузить. ** ** количество услуг ** путало меня. Не могли бы вы объяснить? – Avinash

+0

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

0

Используйте следующий компонент для перезагрузки config.properties через каждые 1 секунду.

@Component 
public class PropertyLoader { 

    @Autowired 
    private StandardEnvironment environment; 

    @Scheduled(fixedRate=1000) 
    public void reload() throws IOException { 
     MutablePropertySources propertySources = environment.getPropertySources(); 
     PropertySource<?> resourcePropertySource = propertySources.get("class path resource [config.properties]"); 
     Properties properties = new Properties(); 
     InputStream inputStream = getClass().getResourceAsStream("/config.properties"); 
     properties.load(inputStream); 
     inputStream.close(); 
     propertySources.replace("class path resource [config.properties]", new PropertiesPropertySource("class path resource [config.properties]", properties)); 
    } 
} 

Ваш главный конфиг будет выглядеть примерно так:

@EnableScheduling 
@PropertySource("classpath:/config.properties") 
public class HelloWorldConfig { 
} 

Тогда доступ к собственности в любом месте:

@Autowired 
private Environment environment; 

environment.get("my.property"); 
Смежные вопросы