2017-10-25 11 views
1

を初期化され、次のように私の問題は、次のとおりです。はSpringBootApplication前springboot application.ymlファイルの値を解析する方法をお探しすることは

私はSSLを使用していることRabbitMQのインスタンスに接続するためのスプリングAMQPを使用しています。残念ながら、春のAMQPは現在、全長のamqps URIをサポートしておらず、優先度リストでのサポートの追加は高くありません(問題:https://github.com/spring-projects/spring-boot/issues/6401参照)。彼らは分離する必要があります。

次のフィールドを接続するために私のapplication.ymlに必要とされています。私のRabbitMQインスタンスの

spring: 
    rabbitmq: 
    host: hostname 
    port: portnumber 
    username: username 
    password: password 
    virtual-host: virtualhost 
    ssl: 
     enabled: true 

マイVCAP_Services環境は次の形式のバーチャルホストと完全な長さのURIを提供します:amqps://username:[email protected]:portnumber/virtualhost

これらの値をコピーしてapplication.ymlに貼り付けるのは今は問題ありませんが、長期的には実行可能ではありません。彼らはvcap_servicesから来る必要があります。

私の@SpringBootApplicationは起動時にrabbitMQインスタンスへの接続を初期化する@Beansを持っていますので、個々の値を解析してアプリケーションを起動する前にそれらを設定する方法を探しています。

答えて

0

をブートの自動構成された接続ファクトリをオーバーライドしますSpringApplication.run。例えば、

@SpringBootApplication 
public class Application { 

    public static void main(String[] args) {  
     YamlPropertiesFactoryBean yamlFactory = new YamlPropertiesFactoryBean(); 
     yamlFactory.setResources(new ClassPathResource("application.yml")); 
     Properties props = yamlFactory.getObject(); 

     String hostname = props.getProperty("spring.rabbitmq.hostname"); 
     ... 

     SpringApplication.run(Application.class, args); 
    } 
} 
+0

私はゲイリーのソリューションに行っていましたが、元の質問に答えてくれたので、これを受け入れています。ありがとうございます。 – treevez

0

単にあなたの春のブートアプリケーションが初期化される前に、プロパティを読んでちょうど興味を持っている場合は、呼び出す前に、あなたは春のYamlPropertiesFactoryBeanを使ってYAMLファイルを解析することができます...

@SpringBootApplication 
public class So46937522Application { 

    public static void main(String[] args) { 
     SpringApplication.run(So46937522Application.class, args); 
    } 

    @Bean 
    public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties config) 
      throws Exception { 
     CachingConnectionFactory connectionFactory = new CachingConnectionFactory(); 
     connectionFactory.getRabbitConnectionFactory() 
      .setUri("amqps://guest:[email protected]:5671/virtualhost"); 
     return connectionFactory; 
    } 

    @RabbitListener(queues = "si.test.queue") 
    public void listen(Message in) { 
     System.out.println(in); 
    } 

} 
+0

はあなたのゲイリーありがとう、これは、ConnectionFactoryクラスがgetRabbitConnectionFactoryメソッドを持っていないようでしたので、私はそのくらいに見ていなかったものの、うまく働いて、私が探していたものを、元々あります。これはリンクされたgithubの問題にも最適なソリューションのようです。 – treevez

関連する問題