Как обойти сеанс Redis в приложении Spring Boot при сбое подключения Redis?

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

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

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

Обновлено 04.11.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>

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


person sof_rebel    schedule 01.11.2019    source источник
comment
Не могли бы вы поделиться минимально воспроизводимым примером?   -  person pedrohreis    schedule 01.11.2019
comment
@pedrohreis, я предоставил более подробную информацию. Пожалуйста, взгляните и дайте мне знать, если вам нужна дополнительная информация.   -  person sof_rebel    schedule 09.11.2019


Ответы (1)


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

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

person hill123455    schedule 11.11.2019
comment
Как это отвечает на вопрос? Очевидно, OP хочет программно переключиться на сеанс БД, когда невозможно подключиться к Redis независимо от среды. - person pedrohreis; 14.11.2019
comment
педрорейс прав. Ответ hill123455 не отвечает на вопрос. По мере его реализации приложение перестает отвечать на запросы, поскольку попытки подключения предпринимаются постоянно. Мне нужен способ либо переключиться на Spring Session, либо остановить дальнейшие попытки подключения хотя бы на определенное время. Любые указатели будут полезны. - person sof_rebel; 30.04.2020