Polish "Add a customizer for Lettuce's ClientOptions"

See gh-40484
This commit is contained in:
Andy Wilkinson 2024-06-27 16:26:53 +01:00
parent c517664f08
commit 1dfb4c9719
4 changed files with 25 additions and 15 deletions

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -23,7 +23,9 @@ import org.springframework.data.redis.connection.lettuce.LettuceClientConfigurat
* Callback interface that can be implemented by beans wishing to customize the * Callback interface that can be implemented by beans wishing to customize the
* {@link LettuceClientConfiguration} through a {@link LettuceClientConfigurationBuilder * {@link LettuceClientConfiguration} through a {@link LettuceClientConfigurationBuilder
* LettuceClientConfiguration.LettuceClientConfigurationBuilder} whilst retaining default * LettuceClientConfiguration.LettuceClientConfigurationBuilder} whilst retaining default
* auto-configuration. * auto-configuration. To customize only the
* {@link LettuceClientConfiguration#getClientOptions() client options} of the
* configuration, use {@link LettuceClientOptionsBuilderCustomizer} instead.
* *
* @author Mark Paluch * @author Mark Paluch
* @since 2.0.0 * @since 2.0.0

View File

@ -1,5 +1,5 @@
/* /*
* Copyright 2012-2023 the original author or authors. * Copyright 2012-2024 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -17,21 +17,26 @@
package org.springframework.boot.autoconfigure.data.redis; package org.springframework.boot.autoconfigure.data.redis;
import io.lettuce.core.ClientOptions; import io.lettuce.core.ClientOptions;
import io.lettuce.core.ClientOptions.Builder;
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration;
/** /**
* Callback interface that can be implemented by beans wishing to customize the * Callback interface that can be implemented by beans wishing to customize the
* {@link ClientOptions} through a {@link ClientOptions.Builder} whilst retaining default * {@link ClientOptions} of the {@link LettuceClientConfiguration} through a
* auto-configuration. * {@link Builder} whilst retaining default auto-configuration. To customize the entire
* configuration, use {@link LettuceClientConfigurationBuilderCustomizer} instead.
* *
* @author Soohyun Lim * @author Soohyun Lim
* @since 3.4.0
*/ */
@FunctionalInterface @FunctionalInterface
public interface LettuceClientOptionsBuilderCustomizer { public interface LettuceClientOptionsBuilderCustomizer {
/** /**
* Customize the {@link ClientOptions.Builder}. * Customize the {@link Builder}.
* @param clientOptionsBuilder the builder to customize * @param clientOptionsBuilder the builder to customize
*/ */
void customize(ClientOptions.Builder clientOptionsBuilder); void customize(Builder clientOptionsBuilder);
} }

View File

@ -91,7 +91,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers, ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers,
ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers, ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers,
ClientResources clientResources) { ClientResources clientResources) {
return createConnectionFactory(clientConfigurationBuilderCustomizers, clientOptionsBuilderCustomizers, clientResources); return createConnectionFactory(clientConfigurationBuilderCustomizers, clientOptionsBuilderCustomizers,
clientResources);
} }
@Bean @Bean
@ -101,7 +102,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers, ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers,
ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers, ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers,
ClientResources clientResources) { ClientResources clientResources) {
LettuceConnectionFactory factory = createConnectionFactory(clientConfigurationBuilderCustomizers, clientOptionsBuilderCustomizers, clientResources); LettuceConnectionFactory factory = createConnectionFactory(clientConfigurationBuilderCustomizers,
clientOptionsBuilderCustomizers, clientResources);
SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-"); SimpleAsyncTaskExecutor executor = new SimpleAsyncTaskExecutor("redis-");
executor.setVirtualThreads(true); executor.setVirtualThreads(true);
factory.setExecutor(executor); factory.setExecutor(executor);
@ -112,8 +114,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers, ObjectProvider<LettuceClientConfigurationBuilderCustomizer> clientConfigurationBuilderCustomizers,
ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers, ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientOptionsBuilderCustomizers,
ClientResources clientResources) { ClientResources clientResources) {
LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(clientConfigurationBuilderCustomizers, clientOptionsBuilderCustomizers, LettuceClientConfiguration clientConfig = getLettuceClientConfiguration(clientConfigurationBuilderCustomizers,
clientResources, getProperties().getLettuce().getPool()); clientOptionsBuilderCustomizers, clientResources, getProperties().getLettuce().getPool());
return createLettuceConnectionFactory(clientConfig); return createLettuceConnectionFactory(clientConfig);
} }
@ -167,7 +169,8 @@ class LettuceConnectionConfiguration extends RedisConnectionConfiguration {
} }
} }
private ClientOptions createClientOptions(ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientConfigurationBuilderCustomizers) { private ClientOptions createClientOptions(
ObjectProvider<LettuceClientOptionsBuilderCustomizer> clientConfigurationBuilderCustomizers) {
ClientOptions.Builder builder = initializeClientOptionsBuilder(); ClientOptions.Builder builder = initializeClientOptionsBuilder();
Duration connectTimeout = getProperties().getConnectTimeout(); Duration connectTimeout = getProperties().getConnectTimeout();
if (connectTimeout != null) { if (connectTimeout != null) {

View File

@ -127,8 +127,8 @@ class RedisAutoConfigurationTests {
this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> { this.contextRunner.withUserConfiguration(CustomConfiguration.class).run((context) -> {
LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class); LettuceConnectionFactory cf = context.getBean(LettuceConnectionFactory.class);
assertThat(cf.isUseSsl()).isTrue(); assertThat(cf.isUseSsl()).isTrue();
cf.getClientConfiguration().getClientOptions().ifPresent(options -> assertThat(cf.getClientConfiguration().getClientOptions())
assertThat(options.isAutoReconnect()).isFalse()); .hasValueSatisfying((options) -> assertThat(options.isAutoReconnect()).isFalse());
}); });
} }
@ -642,7 +642,7 @@ class RedisAutoConfigurationTests {
@Bean @Bean
LettuceClientOptionsBuilderCustomizer clientOptionsBuilderCustomizer() { LettuceClientOptionsBuilderCustomizer clientOptionsBuilderCustomizer() {
return builder -> builder.autoReconnect(false); return (builder) -> builder.autoReconnect(false);
} }
} }