web-dev-qa-db-fra.com

Spring Redis - Lire la configuration à partir du fichier application.properties

Spring Redis travaille avec spring-data-redis avec toutes les configurations par défaut comme localhost default port et ainsi de suite.

Maintenant, j'essaie de faire la même configuration en le configurant dans le fichier application.properties. Mais je ne peux pas comprendre comment créer des beans si mes valeurs de propriété sont lues.

Fichier de configuration Redis

@EnableRedisHttpSession
@Configuration
public class SpringSessionRedisConfiguration {

@Bean
JedisConnectionFactory connectionFactory() {
    return new JedisConnectionFactory();
}

@Autowired
@Bean
RedisCacheManager redisCacheManager(final StringRedisTemplate stringRedisTemplate) {
    return new RedisCacheManager(stringRedisTemplate);
}

@Autowired
@Bean
StringRedisTemplate template(final RedisConnectionFactory connectionFactory) {
    return new StringRedisTemplate(connectionFactory);
}
}

Paramètres standard dans application.properties

spring.redis.sentinel.master = maître

spring.redis.sentinel.nodes = 192.168.188.231: 26379

spring.redis.password = 12345

Ce que j'ai essayé,

  1. Je peux éventuellement utiliser @PropertySource puis injecter @Value et obtenir les valeurs. Mais je ne veux pas faire cela car ces propriétés ne sont pas définies par moi mais proviennent du printemps.
  2. Dans cette documentation Documentation Redis de Spring , il est uniquement indiqué qu'il peut être configuré à l'aide de propriétés, mais ne montre pas d'exemple concret.
  3. J'ai également étudié les classes de l'API Spring Data Redis et constaté que RedisProperties devrait m'aider, mais je ne sais toujours pas comment dire à Spring de lire à partir du fichier de propriétés.
16
Shrikant Havale

Vous pouvez utiliser @PropertySource pour lire les options à partir de application.properties ou d'un autre fichier de propriétés souhaité. Veuillez regarder Exemple d'utilisation de PropertySource et marche exemple d'utilisation de spring-redis-cache . Ou regardez ce petit échantillon:

@Configuration
@PropertySource("application.properties")
public class SpringSessionRedisConfiguration {

    @Value("${redis.hostname}")
    private String redisHostName;

    @Value("${redis.port}")
    private int redisPort;

    @Bean
    public static PropertySourcesPlaceholderConfigurer    propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(redisHostName);
        factory.setPort(redisPort);
        factory.setUsePool(true);
        return factory;
    }

    @Bean
    RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    RedisCacheManager cacheManager() {
        RedisCacheManager redisCacheManager = new RedisCacheManager(redisTemplate());
        return redisCacheManager;
    }
}

Actuellement (décembre 2015) les spring.redis.sentinel options de application.properties ne prennent en charge que RedisSentinelConfiguration:

Veuillez noter qu'actuellement, seulement Jedis et laitue Laitue soutient Redis Sentinel.

Vous pouvez en savoir plus à ce sujet dans documentation officielle

26
misterion

En cherchant plus profondément, j'ai trouvé ceci, est-ce que c'est ce que vous recherchez? 

# REDIS (RedisProperties)
spring.redis.database=0 # Database index used by the connection factory.
spring.redis.Host=localhost # Redis server Host.
spring.redis.password= # Login password of the redis server.
spring.redis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
spring.redis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
spring.redis.pool.max-wait=-1 # Maximum amount of time (in milliseconds) a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
spring.redis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
spring.redis.port=6379 # Redis server port.
spring.redis.sentinel.master= # Name of Redis server.
spring.redis.sentinel.nodes= # Comma-separated list of Host:port pairs.
spring.redis.timeout=0 # Connection timeout in milliseconds. 

Référence: https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html Searchterm Redis 

De ce que je peux voir les valeurs existent déjà et sont définies comme 

spring.redis.Host=localhost # Redis server Host.
spring.redis.port=6379 # Redis server port.

si vous voulez créer vos propres propriétés, vous pouvez consulter mon post précédent dans ce fil. 

6
Wheelchair Geek

Cela fonctionne pour moi:

@Configuration
@EnableRedisRepositories
public class RedisConfig {

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        RedisProperties properties = redisProperties();
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
        configuration.setHostName(properties.getHost());
        configuration.setPort(properties.getPort());

        return new JedisConnectionFactory(configuration);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        final RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setValueSerializer(new GenericToStringSerializer<>(Object.class));
        return template;
    }

    @Bean
    @Primary
    public RedisProperties redisProperties() {
        return new RedisProperties();
    }

}

et fichier de propriétés:

spring.redis.Host=localhost
spring.redis.port=6379
1
user2846650

J'ai trouvé cela dans la doc de démarrage du printemps section 24 paragraphe 7

@Component
@ConfigurationProperties(prefix="connection")
public class ConnectionSettings {

    private String username;

    private InetAddress remoteAddress;

    // ... getters and setters

} 

Les propriétés peuvent ensuite être modifiées via connection.property 

Lien de référence: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-external-config.html#boot-features-external-config-typesafe-configuration-configuration-properties

1
Wheelchair Geek

Voici une solution élégante pour résoudre votre problème:

@Configuration
@PropertySource(name="application", value="classpath:application.properties")
public class SpringSessionRedisConfiguration {

    @Resource
    ConfigurableEnvironment environment;

    @Bean
    public PropertiesPropertySource propertySource() {
        return (PropertiesPropertySource) environment.getPropertySources().get("application");
    }

    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory(sentinelConfiguration(), poolConfiguration());
    }

    @Bean
    public RedisSentinelConfiguration sentinelConfiguration() {
        return new RedisSentinelConfiguration(propertySource());
    }

    @Bean
    public JedisPoolConfig poolConfiguration() {
        JedisPoolConfiguration config = new JedisPoolConfiguration();
        // add your customized configuration if needed
        return config;
    }

    @Bean
    RedisTemplate<Object, Object> redisTemplate() {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<Object, Object>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        return redisTemplate;
    }

    @Bean
    RedisCacheManager cacheManager() {
        return new RedisCacheManager(redisTemplate());
    }

}

alors, pour résumer:

  • ajouter un nom spécifique pour @PropertySource
  • injecter un environnement configurable à la place de l'environnement
  • récupérez le PropertiesPropertySource dans votre environnement configurable en utilisant le nom que vous avez mentionné sur votre @PropertySource
  • Utilisez cet objet PropertySource pour construire votre objet RedisSentinelConfiguration
  • N'oubliez pas d'ajouter les propriétés 'spring.redis.sentinel.master' et 'spring.redis.sentinel.nodes' dans votre fichier de propriétés.

Testé dans mon espace de travail, Cordialement

1
Kelevra

Vous pouvez utiliser ResourcePropertySource pour générer un objet PropertySource.

PropertySource propertySource = new ResourcePropertySource("path/to/your/application.properties");

Puis transmettez-le au constructeur de RedisSentinelConfiguration.

0
Kylo Zhang

Utilisez @DirtiesContext(classMode = classmode.AFTER_CLASS) à chaque classe de test. Cela fonctionnera sûrement pour vous.

0
tarun goel
0
Pulkit