2017-05-12 1 views
1

Je souhaite ajouter une propriété à l'exécution dans le serveur Spring Config et elle devrait être disponible pour toutes les applications client avec l'annotation @Value.Spring Config server ajouter la propriété à l'exécution

Je ne vais pas avoir cette propriété prédéfinie parce que je vais calculer cette valeur dans le serveur de configuration de printemps et ajouter à l'environnement.

Pouvez-vous s'il vous plaît m'aider à comprendre quelle est la meilleure façon d'y parvenir.

+0

regardez cette réponse http://stackoverflow.com/questions/37873433/spring-cloud-config-server-rabbitmq/37873783#37873783 –

+0

Copie possible de [Spring Cloud Config Server + RabbitMQ] (http: // stackoverflow .com/questions/37873433/spring-cloud-config-server-rabbitmq) – Raz0rwire

+1

Nope sa différente question –

Répondre

2

La configuration de nuage de printemps contient une fonctionnalité nommée 'RefreshScope' qui permet d'actualiser les propriétés et les beans d'une application en cours d'exécution. Si vous avez lu à propos de la configuration du cloud de printemps, il semble qu'il ne peut charger que les propriétés d'un dépôt git, mais ce n'est pas vrai.

Vous pouvez utiliser RefreshScope pour recharger des propriétés à partir d'un fichier local sans avoir besoin de se connecter à un référentiel git externe ou à des requêtes HTTP.

Créez un fichier bootstrap.properties avec ce contenu:

# false: spring cloud config will not try to connect to a git repository 
spring.cloud.config.enabled=false 
# let the location point to the file with the reloadable properties 
reloadable-properties.location=file:/config/defaults/reloadable.properties 

Créer un fichier reloadable.properties à l'endroit que vous avez défini ci-dessus. Vous pouvez le laisser vide ou ajouter des propriétés. Dans ce fichier, vous pouvez ultérieurement, lors de l'exécution, modifier ou ajouter des propriétés.

Ajouter une dépendance à

<dependency> 
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring-cloud-starter-config</artifactId> 
</dependency> 

Tous les haricots, qui utilisent des propriétés, qui peuvent être modifiées lors de l'exécution, devrait être annotés avec @RefreshScope comme ceci:

@Bean 
@RefreshScope 
Controller controller() { 
    return new Controller(); 
} 

Créer une classe

public class ReloadablePropertySourceLocator implements PropertySourceLocator 
{ 
     private final String location; 

     public ReloadablePropertySourceLocator(
      @Value("${reloadable-properties.location}") String location) { 
      this.location = location; 
     } 

    /** 
    * must create a new instance of the property source on every call 
    */ 
    @Override 
    public PropertySource<?> locate(Environment environment) { 
     try { 
      return new ResourcePropertySource(location); 
     } catch (IOException e) { 
      throw new RuntimeException(e); 
     } 
    } 
} 

Configurer le printemps à bootstrap the configuration en utilisant cette classe .

Créer (ou prolonger) le fichier META-INF/spring.factories dans votre dossier de ressources:

org.springframework.cloud.bootstrap.BootstrapConfiguration=your.package.ReloadablePropertySourceLocator 

Ce haricot lira les propriétés du reloadable.properties. Spring Cloud Config le rechargera à partir du disque, lorsque vous actualisez l'application.

Ajoutez l'exécution, modifiez reloadable.properties comme vous le souhaitez, puis actualisez le contexte de printemps. Vous pouvez le faire en envoyant une requête POST à ​​l'extrémité /refresh ou en Java en utilisant ContextRefresher:

@Autowired 
ContextRefresher contextRefresher; 
... 
contextRefresher.refresh(); 

Cela devrait également fonctionner, si vous choisissez d'utiliser en parallèle aux propriétés d'un dépôt git à distance.

+0

Merci Stefan pour votre réponse.Je comprends que vous suggérez que nous puissions ajouter la propriété d'exécution dans un fichier externalisé et le serveur de configuration printanier le chargera automatiquement. Mais est-il possible que je puisse réaliser sans écrire à classer. Existe-t-il un moyen de faire quelque chose comme environment.addPorperty (clé, valeur) et il est disponible pour tous les clients de configuration. –

+0

Peut-il être fait globalement pour le projet au lieu de définir des beans avec @RefreshScope –