2017-10-31 15 views
0

単一ノードRedisから、センチネルベースの複数ノードRedisインスタンスへの切り替えは、新しいインスタンスのVCAP構造が異なり、Springによってデフォルトでは処理されないため、 VCAPを自分で解析し、Redis Beanを設定する必要があります。CloudFoundry上のRedisインスタンス用のSentinelノードの設定

春のドキュメントhereに続いて、これは私が私のRedisの豆を適応している方法です。

 public RedisConnectionFactory jedisConnectionFactory(JsonArray sentinelNodes) { 
       RedisSentinelConfiguration sentinelConfig = new RedisSentinelConfiguration().master("mymaster"); 
       String hostname; 
       String port; 
       for (int i = 0; i < sentinelNodes.size(); i++) { 
        JsonObject sentinelNode = sentinelNodes.getJsonObject(i); 
        hostname = sentinelNode.getString("hostname"); 
        port = sentinelNode.getString("port"); 
        sentinelConfig.sentinel(hostname, Integer.parseInt(port)); 
       } 
       return new JedisConnectionFactory(sentinelConfig); 
     } 

     @Bean 
     public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf) { 
       JsonArray sentinelNodes = environmentHandler.getSentinelNodesForRedis(); 
       if (sentinelNodes != null) { 
        cf = jedisConnectionFactory(sentinelNodes); 
       } 
       RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); 
       redisTemplate.setConnectionFactory(cf); 
       redisTemplate.setKeySerializer(new StringRedisSerializer()); 
       redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); 
       return redisTemplate; 
     } 

     @SuppressWarnings("rawtypes") 
     @Bean 
     public CacheManager cacheManager(RedisTemplate redisTemplate) { 
       return new RedisCacheManager(redisTemplate); 
     } 

私はVCAPからセンチネルリンパ節のための情報を取得し、私のJedisConnectionFactoryを作成するためにそれを渡します。私はこのようなBeanを設定できましたが、実行時に例外を受け取りました。'org.springframework.data.redis.RedisConnectionFailureException:Jedis接続を取得できません。ネストされた例外はjava.lang.NullPointerExceptionです:ローカル変数 'shardInfo'からロードされたヌルオブジェクトのメソッドredis.clients.jedis.JedisShardInfo.getHost()を呼び出そうとしています。 (JedisConnectionFactory.java:204)... '。私の理解では、JedisConnectionFactoryはJedisShardInfoではなくRedisSentinelConfigurationを使用して構成しましたが、shardInfoは私には必要ではないはずです。

このライブラリの新しいバージョンを確認すると、この特定のコードがthisに変更されていることがわかりました。だから私はこの新しいバージョンに適応しましたが、次の例外を除いて起動時にアプリケーションがクラッシュするようになりました。

java.lang.NoSuchMethodError:org.springframework.util.Assert.isTrue(ZLjava/util/function/Supplier;)V | org.springframework.data.redis.connection.RedisStandaloneConfigurationにあります(RedisStandaloneConfiguration.java:61)。 org.springframework.data.redis.connection.jedis.JedisConnectionFactoryにあります。(JedisConnectionFactory.java:99)| org.springframework.data.redis.connection.jedis.JedisConnectionFactory。(JedisConnectionFactory.java:111)で...例外後

here連れて行ってくれたが、この例外が発生することがなぜ私は表示されません。

誰かが私が間違っている場所を指し示すことができますか、これらのマルチノードRedisのセンチネルがSpring Boot Beanを通じてどのように設定できるかの例を教えてください。

+0

は、このようなケースを処理するために春のクラウドコネクタへのRedis Sentinelのサポートを追加するために未解決の問題があります:https://github.com/spring-cloud/spring-cloud-connectors/issues/185この問題にRedisサービスインスタンスのための 'VCAP_SERVICES'の例を追加することは可能でしょうか?これは、ソリューションができるだけ多くの種類のレディスサービスをカバーするのに役立ちます。 –

+0

ありがとう、@スコット。私はVCAP構造をこの問題に投稿しました。強化のためのETAはありますか?また、私はすでにこのVCAPの解析とセンチネルノードの設定を行っているので、上記のSpring data redisのRedisStandaloneConfigurationクラスで例外が発生するのはなぜですか? –

答えて

0

RedisConnectionFactoryを返す前にafterPropertiesSet()メソッドを呼び出すと、今のところトリックが完了しているようです。

(また、工場出荷時のパスワードを設定しています。)

関連する問題