@@ -17,6 +17,7 @@ import redis.embedded.RedisCluster
1717import redis.embedded.RedisSentinel
1818import redis.embedded.RedisServer
1919import redis.embedded.core.ExecutableProvider
20+ import redis.embedded.core.ExecutableProvider.newJarResourceProvider
2021import redis.embedded.core.RedisServerBuilder
2122import java.io.File
2223import java.util.stream.IntStream
@@ -27,17 +28,22 @@ private const val DEFAULT_BIND = "127.0.0.1"
2728private const val QUORUM_SIZE = (1 / 2 ) + 1 // quorom size for one main node
2829
2930internal class RedisHighAvailabilityContextCustomizer (
30- private val config : EmbeddedRedisHighAvailability ,
31- private val portProvider : PortProvider = PortProvider ()
31+ private val config : EmbeddedRedisHighAvailability ,
32+ private val portProvider : PortProvider = PortProvider ()
3233) : ContextCustomizer {
3334
3435 private val log = LoggerFactory .getLogger(javaClass)
3536
3637 private val manuallySpecifiedPorts =
37- config.ports.filter { it != 0 }.toSet() + config.sentinels.map { it.port }.filter { it != 0 }.toSet()
38+ config.ports.filter { it != 0 }.toSet() + config.sentinels.map { it.port }.filter { it != 0 }.toSet()
3839 private val name = config.name.ifEmpty { BirdNameProvider .next() }.replace(Regex (" [^a-zA-Z0-9]" ), " " )
3940 private var nodeProvider: NodeProvider ? = null
4041 private val customizer = config.customizer.map { c -> c.createInstance() }.toList()
42+ private val executableProvider = if (config.executeInDirectory.isNotEmpty()) {
43+ newJarResourceProvider(File (config.executeInDirectory))
44+ } else {
45+ newJarResourceProvider()
46+ }
4147
4248 override fun customizeContext (context : ConfigurableApplicationContext , mergedConfig : MergedContextConfiguration ) {
4349 RedisStore .computeIfAbsent(context) {
@@ -71,9 +77,9 @@ internal class RedisHighAvailabilityContextCustomizer(
7177
7278 private fun createReplicas (mainNode : Pair <Node , RedisServer >): List <RedisServer > {
7379 val replicaBuilders =
74- IntStream .range(0 , config.replicas)
75- .mapToObj { _ -> createReplicaBuilder(mainNode.first) }
76- .toList()
80+ IntStream .range(0 , config.replicas)
81+ .mapToObj { _ -> createReplicaBuilder(mainNode.first) }
82+ .toList()
7783 customizer.forEach { c -> c.customizeReplicas(replicaBuilders, config) }
7884
7985 return replicaBuilders.map { it.build() }
@@ -83,11 +89,9 @@ internal class RedisHighAvailabilityContextCustomizer(
8389 nodeProvider = nodeProvider()
8490 val nextNode = nodeProvider!! .next()
8591 val builder = RedisServer .newRedisServer()
86- .bind(nextNode.bind)
87- .port(nextNode.port)
88- if (config.executeInDirectory.isNotEmpty()) {
89- builder.executableProvider(ExecutableProvider .newJarResourceProvider(File (config.executeInDirectory)))
90- }
92+ .bind(nextNode.bind)
93+ .port(nextNode.port)
94+ builder.executableProvider(executableProvider)
9195 customizer.forEach { c -> c.customizeMainNode(builder, config) }
9296 val mainNode = builder.build()
9397 mainNode.start()
@@ -103,16 +107,14 @@ internal class RedisHighAvailabilityContextCustomizer(
103107 }
104108
105109 private fun createReplicaBuilder (
106- mainNode : Node
110+ mainNode : Node
107111 ): RedisServerBuilder {
108112 val nextNode = nodeProvider!! .next()
109113 val builder = RedisServer .newRedisServer()
110- .bind(nextNode.bind)
111- .port(nextNode.port)
112- .slaveOf(mainNode.bind, mainNode.port)
113- if (config.executeInDirectory.isNotEmpty()) {
114- builder.executableProvider(ExecutableProvider .newJarResourceProvider(File (config.executeInDirectory)))
115- }
114+ .bind(nextNode.bind)
115+ .port(nextNode.port)
116+ .slaveOf(mainNode.bind, mainNode.port)
117+ builder.executableProvider(executableProvider)
116118 return builder
117119 }
118120
@@ -141,56 +143,54 @@ internal class RedisHighAvailabilityContextCustomizer(
141143 }
142144
143145 private fun createSentinel (
144- sentinelConfig : EmbeddedRedisHighAvailability .Sentinel ,
145- mainNode : Pair <Node , RedisServer >
146+ sentinelConfig : EmbeddedRedisHighAvailability .Sentinel ,
147+ mainNode : Pair <Node , RedisServer >
146148 ): RedisSentinel {
147149 val builder = RedisSentinel .newRedisSentinel()
148- .bind(sentinelConfig.bind.ifEmpty { DEFAULT_BIND })
149- .port(if (sentinelConfig.port == 0 ) unspecifiedUnusedPort(true ) else sentinelConfig.port)
150- .setting(" sentinel monitor $name ${mainNode.first.bind} ${mainNode.first.port} $QUORUM_SIZE " )
151- .setting(" sentinel down-after-milliseconds $name ${sentinelConfig.downAfterMillis} " )
152- .setting(" sentinel failover-timeout $name ${sentinelConfig.failOverTimeoutMillis} " )
153- .setting(" sentinel parallel-syncs $name ${sentinelConfig.parallelSyncs} " )
154- if (config.executeInDirectory.isNotEmpty()) {
155- builder.executableProvider(ExecutableProvider .newJarResourceProvider(File (config.executeInDirectory)))
156- }
150+ .bind(sentinelConfig.bind.ifEmpty { DEFAULT_BIND })
151+ .port(if (sentinelConfig.port == 0 ) unspecifiedUnusedPort(true ) else sentinelConfig.port)
152+ .setting(" sentinel monitor $name ${mainNode.first.bind} ${mainNode.first.port} $QUORUM_SIZE " )
153+ .setting(" sentinel down-after-milliseconds $name ${sentinelConfig.downAfterMillis} " )
154+ .setting(" sentinel failover-timeout $name ${sentinelConfig.failOverTimeoutMillis} " )
155+ .setting(" sentinel parallel-syncs $name ${sentinelConfig.parallelSyncs} " )
156+ builder.executableProvider(executableProvider)
157157 customizer.forEach { c -> c.customizeSentinels(builder, config, sentinelConfig) }
158158 return builder.build()
159159 }
160160
161161 private fun parseSentinelAddresses (redisHighAvailability : RedisCluster ): List <Pair <String , Int >> =
162- redisHighAvailability.sentinels()
163- .map { parseBindAddress(it) to it.ports().first() }
164- .toList()
162+ redisHighAvailability.sentinels()
163+ .map { parseBindAddress(it) to it.ports().first() }
164+ .toList()
165165
166166 private fun createClient (sentinelAddresses : List <Pair <String , Int >>): RedisClient {
167167 val jedisSentinelPool =
168- JedisSentinelPool (name, sentinelAddresses.map { createAddress(it.first, it.second) }.toSet())
168+ JedisSentinelPool (name, sentinelAddresses.map { createAddress(it.first, it.second) }.toSet())
169169 return RedisHighAvailabilityClient (jedisSentinelPool)
170170 }
171171
172172 private fun setSpringProperties (
173- context : ConfigurableApplicationContext ,
174- sentinelAddresses : List <Pair <String , Int >>
173+ context : ConfigurableApplicationContext ,
174+ sentinelAddresses : List <Pair <String , Int >>
175175 ) {
176176 val nodes = sentinelAddresses.joinToString(" ," ) {
177177 createAddress(
178- it.first,
179- it.second
178+ it.first,
179+ it.second
180180 )
181181 }
182182 TestPropertyValues .of(
183- mapOf (
184- " spring.data.redis.sentinel.master" to name,
185- " spring.data.redis.sentinel.nodes" to nodes
186- )
183+ mapOf (
184+ " spring.data.redis.sentinel.master" to name,
185+ " spring.data.redis.sentinel.nodes" to nodes
186+ )
187187 ).applyTo(context.environment)
188188 }
189189
190190 private fun addShutdownListener (
191- context : ConfigurableApplicationContext ,
192- redisHighAvailability : RedisCluster ,
193- client : RedisClient
191+ context : ConfigurableApplicationContext ,
192+ redisHighAvailability : RedisCluster ,
193+ client : RedisClient
194194 ) {
195195 context.addApplicationListener { event ->
196196 if (event is ContextClosedEvent ) {
@@ -227,8 +227,8 @@ internal class RedisHighAvailabilityContextCustomizer(
227227
228228 internal data class Node (val port : Int , val bind : String ) {
229229 constructor (node: RedisServer ) : this (
230- node.ports().first(),
231- parseBindAddress(node)
230+ node.ports().first(),
231+ parseBindAddress(node)
232232 )
233233 }
234234
0 commit comments