You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by hq...@apache.org on 2025/06/04 07:44:16 UTC

(james-project) 07/10: JAMES-3693 RedisClientFactory: better method extraction

This is an automated email from the ASF dual-hosted git repository.

hqtran pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git

commit e3c202a4d4f88e16e4036c69fd6460f487510780
Author: Quan Tran <hq...@linagora.com>
AuthorDate: Mon Jun 2 14:24:27 2025 +0700

    JAMES-3693 RedisClientFactory: better method extraction
    
    To simplify the code and avoid duplication.
---
 .../james/backends/redis/RedisClientFactory.scala  | 46 +++++++++-------------
 .../james/backends/redis/RedisConfiguration.scala  |  4 ++
 2 files changed, 22 insertions(+), 28 deletions(-)

diff --git a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisClientFactory.scala b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisClientFactory.scala
index 054de42d1f..2474bb2262 100644
--- a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisClientFactory.scala
+++ b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisClientFactory.scala
@@ -21,7 +21,7 @@ package org.apache.james.backends.redis
 
 import io.lettuce.core.cluster.{ClusterClientOptions, RedisClusterClient}
 import io.lettuce.core.resource.{ClientResources, ThreadFactoryProvider}
-import io.lettuce.core.{AbstractRedisClient, ClientOptions, RedisClient, SslOptions, TimeoutOptions}
+import io.lettuce.core.{AbstractRedisClient, ClientOptions, RedisClient, RedisURI, SslOptions, TimeoutOptions}
 import jakarta.annotation.PreDestroy
 import jakarta.inject.{Inject, Singleton}
 import org.apache.james.filesystem.api.FileSystem
@@ -42,22 +42,11 @@ class RedisClientFactory @Singleton() @Inject()
     case sentinelRedisConfiguration: SentinelRedisConfiguration => createSentinelClient(sentinelRedisConfiguration)
   }
 
-  private def createStandaloneClient(standaloneRedisConfiguration: StandaloneRedisConfiguration): RedisClient = {
-    val resourceBuilder: ClientResources.Builder = ClientResources.builder()
-      .threadFactoryProvider(threadFactoryProvider)
-    standaloneRedisConfiguration.ioThreads.foreach(value => resourceBuilder.ioThreadPoolSize(value))
-    standaloneRedisConfiguration.workerThreads.foreach(value => resourceBuilder.computationThreadPoolSize(value))
-    val redisClient = RedisClient.create(resourceBuilder.build(), standaloneRedisConfiguration.redisURI)
-    redisClient.setOptions(createClientOptions(standaloneRedisConfiguration.useSSL, standaloneRedisConfiguration.mayBeSSLConfiguration))
-    redisClient
-  }
+  private def createStandaloneClient(standaloneRedisConfiguration: StandaloneRedisConfiguration): RedisClient =
+    createRedisClient(standaloneRedisConfiguration, Some(standaloneRedisConfiguration.redisURI))
 
   private def createClusterClient(clusterRedisConfiguration: ClusterRedisConfiguration): RedisClusterClient = {
-    val resourceBuilder: ClientResources.Builder = ClientResources.builder()
-      .threadFactoryProvider(threadFactoryProvider)
-    clusterRedisConfiguration.ioThreads.foreach(value => resourceBuilder.ioThreadPoolSize(value))
-    clusterRedisConfiguration.workerThreads.foreach(value => resourceBuilder.computationThreadPoolSize(value))
-    val redisClient = RedisClusterClient.create(resourceBuilder.build(),
+    val redisClient = RedisClusterClient.create(createClientResources(clusterRedisConfiguration),
       clusterRedisConfiguration.redisURI.value.asJava)
     redisClient.setOptions(ClusterClientOptions.builder(
         createClientOptions(clusterRedisConfiguration.useSSL, clusterRedisConfiguration.mayBeSSLConfiguration))
@@ -65,24 +54,25 @@ class RedisClientFactory @Singleton() @Inject()
     redisClient
   }
 
-  private def createMasterReplicaClient(masterReplicaRedisConfiguration: MasterReplicaRedisConfiguration): RedisClient = {
-    val resourceBuilder: ClientResources.Builder = ClientResources.builder()
-      .threadFactoryProvider(threadFactoryProvider)
-    masterReplicaRedisConfiguration.ioThreads.foreach(value => resourceBuilder.ioThreadPoolSize(value))
-    masterReplicaRedisConfiguration.workerThreads.foreach(value => resourceBuilder.computationThreadPoolSize(value))
-    val redisClient = RedisClient.create(resourceBuilder.build())
-    redisClient.setOptions(createClientOptions(masterReplicaRedisConfiguration.useSSL, masterReplicaRedisConfiguration.mayBeSSLConfiguration))
+  private def createMasterReplicaClient(masterReplicaRedisConfiguration: MasterReplicaRedisConfiguration): RedisClient =
+    createRedisClient(masterReplicaRedisConfiguration, maybeRedisUri = None)
+
+  private def createSentinelClient(sentinelRedisConfiguration: SentinelRedisConfiguration): RedisClient =
+    createRedisClient(sentinelRedisConfiguration, Some(sentinelRedisConfiguration.redisURI))
+
+  private def createRedisClient(redisConfiguration: RedisConfiguration, maybeRedisUri: Option[RedisURI]): RedisClient = {
+    val redisClient = maybeRedisUri.map(redisUri => RedisClient.create(createClientResources(redisConfiguration), redisUri))
+      .getOrElse(RedisClient.create(createClientResources(redisConfiguration)))
+    redisClient.setOptions(createClientOptions(redisConfiguration.useSSL, redisConfiguration.mayBeSSLConfiguration))
     redisClient
   }
 
-  private def createSentinelClient(sentinelRedisConfiguration: SentinelRedisConfiguration): RedisClient = {
+  private def createClientResources(redisConfiguration: RedisConfiguration): ClientResources = {
     val resourceBuilder: ClientResources.Builder = ClientResources.builder()
       .threadFactoryProvider(threadFactoryProvider)
-    sentinelRedisConfiguration.ioThreads.foreach(value => resourceBuilder.ioThreadPoolSize(value))
-    sentinelRedisConfiguration.workerThreads.foreach(value => resourceBuilder.computationThreadPoolSize(value))
-    val redisClient = RedisClient.create(resourceBuilder.build(), sentinelRedisConfiguration.redisURI)
-    redisClient.setOptions(createClientOptions(sentinelRedisConfiguration.useSSL, sentinelRedisConfiguration.mayBeSSLConfiguration))
-    redisClient
+    redisConfiguration.ioThreads.foreach(value => resourceBuilder.ioThreadPoolSize(value))
+    redisConfiguration.workerThreads.foreach(value => resourceBuilder.computationThreadPoolSize(value))
+    resourceBuilder.build()
   }
 
   private def createClientOptions(useSSL: Boolean, mayBeSSLConfiguration: Option[SSLConfiguration]): ClientOptions = {
diff --git a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
index 83329fc596..cc4b387b79 100644
--- a/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
+++ b/backends-common/redis/src/main/java/org/apache/james/backends/redis/RedisConfiguration.scala
@@ -97,6 +97,10 @@ trait RedisConfiguration {
 
   def workerThreads: Option[Int]
 
+  def useSSL: Boolean
+
+  def mayBeSSLConfiguration: Option[SSLConfiguration]
+
   def asString: String
 }
 


---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org