From a1ef9a497086805e55298341bbbb7d612bf98548 Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Mon, 2 Dec 2024 10:46:48 +0900
Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=98=88?=
 =?UTF-8?q?=EC=95=BD=20=EC=98=A4=ED=94=88=20=EC=84=A4=EC=A0=95=20-=20?=
 =?UTF-8?q?=EC=8A=A4=EC=BC=80=EC=A4=84=EB=9F=AC=20=EC=84=A4=EC=A0=95=20?=
 =?UTF-8?q?=EC=88=98=EC=A0=95=20-=20=EC=99=B8=EB=B6=80=EC=97=90=EC=84=9C?=
 =?UTF-8?q?=20=EC=8B=A4=ED=96=89=EB=90=98=EB=8A=94=20endpoint=20=EC=A0=9C?=
 =?UTF-8?q?=EA=B1=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../sodalive/configs/SchedulerConfig.kt       | 14 ++++++++-
 .../content/AudioContentController.kt         |  6 ----
 .../AudioContentReleaseScheduledTask.kt       | 31 +++++++++++++++++++
 .../AudioContentReleaseSchedulerService.kt    | 15 ---------
 4 files changed, 44 insertions(+), 22 deletions(-)
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt
 delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseSchedulerService.kt

diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/SchedulerConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/SchedulerConfig.kt
index 116acc6..a6a982a 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/SchedulerConfig.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/SchedulerConfig.kt
@@ -8,11 +8,23 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
 @Configuration
 @EnableScheduling
 class SchedulerConfig {
-    @Bean
+    @Bean(name = ["taskScheduler"])
     fun taskScheduler(): ThreadPoolTaskScheduler {
+        val scheduler = ThreadPoolTaskScheduler()
+        scheduler.poolSize = 5
+        scheduler.setThreadNamePrefix("DefaultScheduler-")
+        scheduler.setWaitForTasksToCompleteOnShutdown(true) // 종료 시 대기 설정
+        scheduler.setAwaitTerminationSeconds(10) // 최대 10초 대기
+        return scheduler
+    }
+
+    @Bean(name = ["audioContentReleaseScheduler"])
+    fun audioContentReleaseScheduler(): ThreadPoolTaskScheduler {
         val scheduler = ThreadPoolTaskScheduler()
         scheduler.poolSize = 2
         scheduler.setThreadNamePrefix("AudioContentRelease-Scheduler-")
+        scheduler.setWaitForTasksToCompleteOnShutdown(true) // 종료 시 대기 설정
+        scheduler.setAwaitTerminationSeconds(10) // 최대 10초 대기
         return scheduler
     }
 }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt
index 750a882..2a2a983 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt
@@ -193,12 +193,6 @@ class AudioContentController(private val service: AudioContentService) {
         )
     }
 
-    @PostMapping("/release")
-    @PreAuthorize("hasRole('BOT')")
-    fun releaseContent() = run {
-        ApiResponse.ok(service.releaseContent())
-    }
-
     @PostMapping("/pin-to-the-top/{id}")
     @PreAuthorize("hasRole('CREATOR')")
     fun pinToTheTop(
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt b/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt
new file mode 100644
index 0000000..503b028
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseScheduledTask.kt
@@ -0,0 +1,31 @@
+package kr.co.vividnext.sodalive.scheduler
+
+import kr.co.vividnext.sodalive.content.AudioContentService
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler
+import org.springframework.scheduling.support.CronTrigger
+import org.springframework.stereotype.Component
+import java.util.concurrent.ScheduledFuture
+import javax.annotation.PostConstruct
+import javax.annotation.PreDestroy
+
+@Component
+class AudioContentReleaseScheduledTask(
+    private val audioContentService: AudioContentService,
+    private val audioContentReleaseScheduler: ThreadPoolTaskScheduler
+) {
+    private var scheduledTask: ScheduledFuture<*>? = null
+
+    @PostConstruct
+    fun release() {
+        scheduledTask = audioContentReleaseScheduler.schedule(
+            { audioContentService.releaseContent() },
+            CronTrigger("0 0/15 * * * *")
+        )
+    }
+
+    @PreDestroy
+    fun stopReleaseScheduler() {
+        scheduledTask?.cancel(false)
+        audioContentReleaseScheduler.shutdown()
+    }
+}
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseSchedulerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseSchedulerService.kt
deleted file mode 100644
index a6b847f..0000000
--- a/src/main/kotlin/kr/co/vividnext/sodalive/scheduler/AudioContentReleaseSchedulerService.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package kr.co.vividnext.sodalive.scheduler
-
-import kr.co.vividnext.sodalive.content.AudioContentService
-import org.springframework.scheduling.annotation.Scheduled
-import org.springframework.stereotype.Service
-
-@Service
-class AudioContentReleaseSchedulerService(
-    private val audioContentService: AudioContentService
-) {
-    @Scheduled(cron = "0 0/15 * * * *")
-    fun release() {
-        audioContentService.releaseContent()
-    }
-}