Где можно закрыть соединение Redtuce Redis в моем приложении Spring Boot? - PullRequest
3 голосов
/ 30 мая 2019

Я инициализировал приложение Spring Boot с конфигурацией Lettuce (io.lettuce.core.api), как это

@Configuration
class RedisConfiguration  {

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

    private StatefulRedisConnection<String, String> redisConnection;
    private static RedisClient redisClient;

    @Bean
    public RedisCommands connectionFactory() {
        RedisURI redisURI = RedisURI.create(redisHostname,redisPort);
        redisClient = RedisClient.create(redisURI);
        redisConnection = redisClient.connect();
        RedisCommands<String, String> syncCommands = 
        redisConnection.sync();
        return syncCommands;
    }
}

Я хочу позвонить redisClient.shutdown();, когда приложение закрывается или завершает работу. Что такое правильное место для разрыва соединения с Redis?

1 Ответ

2 голосов
/ 09 июня 2019

У вас есть два варианта:

  1. Использование @PreDestroy:
    @PreDestroy
    public StatefulRedisConnection<String, String> redisConnection() {
        redisConnection.close();
        redisClient.close();
    }
С помощью @Bean методов

Убедитесь, что RedisClient и StatefulRedisConnection выставлены как бобы.Интерфейсы команд (RedisCommands) не предоставляют метод close().

@Configuration
class RedisConfiguration  {

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

    @Bean(destroyMethod = "close")
    public StatefulRedisConnection<String, String> redisClient() {
        RedisURI redisURI = RedisURI.create(redisHostname,redisPort);
        return RedisClient.create(redisURI);
        redisConnection = redisClient.connect();
    }

    @Bean(destroyMethod = "close")
    public StatefulRedisConnection<String, String> redisConnection(RedisClient client) {
        return client.connect();
    }

    @Bean
    public RedisCommands redisCommands(StatefulRedisConnection<String, String> connection) {
        return connection.sync();
    }
}

Первый метод короче, тогда как подход @Bean позволяет взаимодействовать с промежуточными объектами в приложении.

...