From 1649c08356909009e620f02e5ea5c17bdcaa56fb Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Dec 2024 19:18:28 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=98=88=EC=95=BD=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EC=98=A4=ED=94=88=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=9F=AC=20-=20=EC=84=9C=EB=B2=84=20=ED=95=9C=20=EB=8C=80?= =?UTF-8?q?=EC=97=90=EC=84=9C=EB=A7=8C=20=EC=8B=A4=ED=96=89=EB=90=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20Redisson=EC=9D=84=20=EC=9D=B4=EC=9A=A9?= =?UTF-8?q?=ED=95=98=EC=97=AC=20=EB=B6=84=EC=82=B0=EB=9D=BD=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + .../vividnext/sodalive/configs/RedisConfig.kt | 13 +++++++++++ .../AudioContentReleaseScheduledTask.kt | 23 ++++++++++++++++++- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index b0ee365..b260db1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -26,6 +26,7 @@ repositories { } dependencies { + implementation("org.redisson:redisson-spring-data-27:3.19.2") implementation("org.springframework.boot:spring-boot-starter-aop") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-data-redis") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 09989bd..0f0cdf3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -1,5 +1,8 @@ package kr.co.vividnext.sodalive.configs +import org.redisson.Redisson +import org.redisson.api.RedissonClient +import org.redisson.config.Config import org.springframework.beans.factory.annotation.Value import org.springframework.cache.annotation.EnableCaching import org.springframework.context.annotation.Bean @@ -26,6 +29,16 @@ class RedisConfig( @Value("\${spring.redis.port}") private val port: Int ) { + @Bean(destroyMethod = "shutdown") + fun redissonClient(): RedissonClient { + val config = Config() + config.useSingleServer() + .setAddress("redis://$host:$port") + .setConnectionMinimumIdleSize(1) + .setConnectionPoolSize(5) + return Redisson.create(config) + } + @Bean fun redisConnectionFactory(): RedisConnectionFactory { val clientConfiguration = LettuceClientConfiguration.builder() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt b/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt index b07c6fe..675cf1c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt @@ -1,17 +1,20 @@ package kr.co.vividnext.sodalive.scheduler import kr.co.vividnext.sodalive.content.AudioContentService +import org.redisson.api.RedissonClient import org.springframework.beans.factory.annotation.Qualifier import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler import org.springframework.scheduling.support.CronTrigger import org.springframework.stereotype.Component import java.util.concurrent.ScheduledFuture +import java.util.concurrent.TimeUnit import javax.annotation.PostConstruct import javax.annotation.PreDestroy @Component class AudioContentReleaseScheduledTask( private val audioContentService: AudioContentService, + private val redissonClient: RedissonClient, @Qualifier("audioContentReleaseScheduler") private val audioContentReleaseScheduler: ThreadPoolTaskScheduler ) { private var scheduledTask: ScheduledFuture<*>? = null @@ -19,7 +22,25 @@ class AudioContentReleaseScheduledTask( @PostConstruct fun release() { scheduledTask = audioContentReleaseScheduler.schedule( - { audioContentService.releaseContent() }, + { + val lockName = "lock:audioContentRelease" + val lock = redissonClient.getLock(lockName) + + try { + // 5초 동안 락을 시도하고, Watchdog 활성화 (-1 설정) + if (lock.tryLock(5, -1, TimeUnit.SECONDS)) { + println("acquired : $lockName") + audioContentService.releaseContent() + } else { + println("Failed to acquire lock : $lockName") + } + } finally { + if (lock.isHeldByCurrentThread) { + lock.unlock() + println("release : $lockName") + } + } + }, CronTrigger("0 0/15 * * * *") ) } From b33945d21c60093f541201a1e7d4114a20409cdc Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Dec 2024 19:47:32 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Redisson=20Config=20-=20ssl=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 0f0cdf3..3e70211 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -33,7 +33,9 @@ class RedisConfig( fun redissonClient(): RedissonClient { val config = Config() config.useSingleServer() - .setAddress("redis://$host:$port") + .setAddress("rediss://$host:$port") + .setSslEnableEndpointIdentification(true) + .setSslTruststore(null) .setConnectionMinimumIdleSize(1) .setConnectionPoolSize(5) return Redisson.create(config) From 1ca676ce0b7dd4b1c9001aa2e11160b0e4061791 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Dec 2024 20:25:07 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Redisson=20Config=20-=20=EC=B5=9C=EC=86=8C?= =?UTF-8?q?=20=EC=9C=A0=ED=9C=B4=20=EC=97=B0=EA=B2=B0=200,=20DNS=20?= =?UTF-8?q?=EB=AA=A8=EB=8B=88=ED=84=B0=EB=A7=81=20=EA=B0=84=EA=B2=A9=2030?= =?UTF-8?q?=EC=B4=88=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 3e70211..0191d75 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -36,7 +36,8 @@ class RedisConfig( .setAddress("rediss://$host:$port") .setSslEnableEndpointIdentification(true) .setSslTruststore(null) - .setConnectionMinimumIdleSize(1) + .setDnsMonitoringInterval(30) + .setConnectionMinimumIdleSize(0) .setConnectionPoolSize(5) return Redisson.create(config) } From 368c64715180411561402b03df973add40638798 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 2 Dec 2024 20:26:46 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Redisson=20Config=20-=20=EC=B5=9C=EC=86=8C?= =?UTF-8?q?=20=EC=9C=A0=ED=9C=B4=20=EC=97=B0=EA=B2=B0=200,=20DNS=20?= =?UTF-8?q?=EB=AA=A8=EB=8B=88=ED=84=B0=EB=A7=81=20=EA=B0=84=EA=B2=A9=2030?= =?UTF-8?q?=EC=B4=88=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt index 0191d75..cf2a581 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/RedisConfig.kt @@ -36,7 +36,7 @@ class RedisConfig( .setAddress("rediss://$host:$port") .setSslEnableEndpointIdentification(true) .setSslTruststore(null) - .setDnsMonitoringInterval(30) + .setDnsMonitoringInterval(30000) .setConnectionMinimumIdleSize(0) .setConnectionPoolSize(5) return Redisson.create(config)