Skip to content

Commit 291fe34

Browse files
authored
GH-3716 Fix wait for init redisMsgListenContainer
Fixes #3716 If the `redisMessageListenerContainer` is starting, waiting for it to complete without doing `subscribeUnlock()` * Introduce `isRunningRedisMessageListenerContainer` state since the `running` in the `RedisMessageListenerContainer` is set in the beginning of the `start()` misleading on the concurrent calls to the `RedisLockRegistry` **Cherry-pick to `5.5.x`**
1 parent 055eadc commit 291fe34

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

spring-integration-redis/src/main/java/org/springframework/integration/redis/util/RedisLockRegistry.java

+14-3
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,7 @@ protected boolean removeEldestEntry(Entry<String, RedisLock> eldest) {
164164
private boolean executorExplicitlySet;
165165

166166
private volatile boolean unlinkAvailable = true;
167+
private volatile boolean isRunningRedisMessageListenerContainer = false;
167168

168169
/**
169170
* Constructs a lock registry with the default (60 second) lock expiration.
@@ -364,9 +365,9 @@ private boolean subscribeLock(long time) throws ExecutionException, InterruptedE
364365
return true;
365366
}
366367

367-
if (!RedisLockRegistry.this.redisMessageListenerContainer.isRunning()) {
368-
RedisLockRegistry.this.redisMessageListenerContainer.afterPropertiesSet();
369-
RedisLockRegistry.this.redisMessageListenerContainer.start();
368+
if (!(RedisLockRegistry.this.isRunningRedisMessageListenerContainer
369+
&& RedisLockRegistry.this.redisMessageListenerContainer.isRunning())) {
370+
runRedisMessageListenerContainer();
370371
}
371372
while (time == -1 || expiredTime >= System.currentTimeMillis()) {
372373
try {
@@ -523,6 +524,16 @@ private RedisLockRegistry getOuterType() {
523524
return RedisLockRegistry.this;
524525
}
525526

527+
private void runRedisMessageListenerContainer() {
528+
synchronized (RedisLockRegistry.this.redisMessageListenerContainer) {
529+
if (!(RedisLockRegistry.this.isRunningRedisMessageListenerContainer
530+
&& RedisLockRegistry.this.redisMessageListenerContainer.isRunning())) {
531+
RedisLockRegistry.this.redisMessageListenerContainer.afterPropertiesSet();
532+
RedisLockRegistry.this.redisMessageListenerContainer.start();
533+
RedisLockRegistry.this.isRunningRedisMessageListenerContainer = true;
534+
}
535+
}
536+
}
526537
}
527538

528539
private static final class RedisUnLockNotifyMessageListener implements MessageListener {

0 commit comments

Comments
 (0)