Как обойти сеанс Redis в приложении Spring Boot при сбое подключения Redis? - PullRequest
0 голосов
/ 01 ноября 2019

Я реализовал управление сессиями Redis с помощью LettuceConnectionFactory в своем Java-приложении Spring Boot, следуя некоторым из примеров приложений и документации Spring. Он отлично работает, когда он может подключиться к серверу Redis. Но приложение не отвечает при сбое подключения, потому что оно неоднократно пытается подключиться. Я провел много исследований, чтобы найти решение, но пока ничего не смог найти. У меня есть следующие вопросы:

  1. Есть ли способ переключиться на сеанс Spring (это может быть даже сеанс JDBC), когда он не может подключиться к Redis после определенного числа попыток?
  2. Есть ли способ установить количество повторных попыток в фабрике соединений? Я не вижу никаких свойств для этого в списке свойств spring.redis.

Любая помощь приветствуется.

Обновлено 11/4/2019

Свойства приложения:


spring.session.store-type=redis
spring.session.redis.flush-mode=on-save
spring.session.redis.namespace=spring:session
spring.redis.host=*****.windows.net
spring.redis.port=6380
spring.redis.ssl=true
spring.redis.password=****************
spring.redis.timeout=5000ms
spring.redis.custom.command.timeout=1000ms

HttpSessionConfig.java:


@Configuration
@PropertySource("classpath:application.properties")
@EnableRedisHttpSession
public class HttpSessionConfig extends AbstractHttpSessionApplicationInitializer {

    Logger logger = LoggerFactory.getLogger(HttpSessionConfig.class);

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

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

    @Value("${spring.redis.password}")
    private String redisPassword;

    private @Value("${spring.redis.custom.command.timeout}")
    Duration redisCommandTimeout;

    private @Value("${spring.redis.timeout}")
    Duration socketTimeout;


    @Bean
    LettuceConnectionFactory lettuceConnectionFactory() {

        final SocketOptions socketOptions = SocketOptions.builder().connectTimeout(socketTimeout).build();

        final ClientOptions clientOptions = ClientOptions.builder()
                .socketOptions(socketOptions)
                .build();

        LettuceClientConfiguration clientConfig = LettuceClientConfiguration.builder()
                .commandTimeout(redisCommandTimeout)
                .clientOptions(clientOptions)
                .readFrom(ReadFrom.SLAVE_PREFERRED)
                .build();
        RedisStandaloneConfiguration serverConfig = new RedisStandaloneConfiguration(redisHostName,
                redisPort);

        final LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(serverConfig,
                clientConfig);
        return lettuceConnectionFactory;
    }


    @Bean
    public RedisTemplate<Object, Object> sessionRedisTemplate() {
        final RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(lettuceConnectionFactory());
        return template;
    }     

    @Bean
    public ConfigureRedisAction configureRedisAction() {
        return ConfigureRedisAction.NO_OP;
    }
}

Зависимости:


<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-redis</artifactId>
   <version>2.1.4.RELEASE</version>
</dependency>
<dependency>
   <groupId>biz.paluch.redis</groupId>
   <artifactId>lettuce</artifactId>
   <version>3.5.0.Final</version>
</dependency>
<dependency>
   <groupId>io.lettuce</groupId>
   <artifactId>lettuce-core</artifactId>
   <version>5.1.6.RELEASE</version>
   <optional>true</optional>
</dependency>

Пожалуйста, дайте мне знать, если требуется более подробная информация.

1 Ответ

0 голосов
/ 11 ноября 2019

Как и мы, мы используем @Profile (value = "production") для RedisHttpSession и @Profile (value = "development") для DevSessionConfig

, а затем можем использовать настройку spring.profiles.active в приложении. свойства

...