fix(content-ranking): 스냅샷 job 실패 상태를 보존한다

This commit is contained in:
2026-06-24 23:47:36 +09:00
parent 79be172b93
commit 87f6e47844
2 changed files with 104 additions and 18 deletions

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.ranking.application
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingPeriodPolicy
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingType
import kr.co.vividnext.sodalive.v2.ranking.domain.CreatorRankingUtcRange
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobPort
import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingSnapshotJobRecord
@@ -34,9 +35,7 @@ class CreatorRankingSnapshotJobService(
fun refreshLastCompletedWeekByScheduledJob() {
withLastCompletedWeekPeriodLock { now, utcRange ->
transactionTemplate.executeWithoutResult {
refreshLastCompletedWeekByScheduledJob(now, utcRange)
}
refreshLastCompletedWeekByScheduledJob(now, utcRange)
}
}
@@ -44,31 +43,66 @@ class CreatorRankingSnapshotJobService(
now: ZonedDateTime,
utcRange: CreatorRankingUtcRange
) {
val job = jobPort.save(
CreatorRankingSnapshotJobRecord(
aggregationStartAtUtc = utcRange.startInclusiveUtc,
aggregationEndAtUtc = utcRange.endExclusiveUtc,
trigger = CreatorRankingSnapshotJobTrigger.SCHEDULED,
status = CreatorRankingSnapshotJobStatus.PENDING,
lastError = null,
processingStartedAt = null,
processedAt = null
)
)
val job = savePendingJob(utcRange, CreatorRankingSnapshotJobTrigger.SCHEDULED)
val jobId = job.id ?: return
jobPort.markProcessing(jobId, LocalDateTime.now())
markProcessing(jobId)
logJobStatusChanged(job, CreatorRankingSnapshotJobStatus.PROCESSING)
try {
refreshService.refreshLastCompletedWeek(now)
jobPort.markDone(jobId, LocalDateTime.now())
refresh(now)
markDone(jobId)
logJobStatusChanged(job, CreatorRankingSnapshotJobStatus.DONE)
} catch (ex: Exception) {
jobPort.markFailed(jobId, LocalDateTime.now(), ex.message)
markFailed(jobId, ex.message)
logJobStatusChanged(job, CreatorRankingSnapshotJobStatus.FAILED, ex.message)
throw ex
}
}
private fun refresh(now: ZonedDateTime) {
transactionTemplate.executeWithoutResult {
refreshService.refreshLastCompletedWeek(now)
}
}
private fun savePendingJob(
utcRange: CreatorRankingUtcRange,
trigger: CreatorRankingSnapshotJobTrigger
): CreatorRankingSnapshotJobRecord {
return transactionTemplate.execute {
jobPort.save(
CreatorRankingSnapshotJobRecord(
rankingType = CreatorRankingType.WEEKLY,
aggregationStartAtUtc = utcRange.startInclusiveUtc,
aggregationEndAtUtc = utcRange.endExclusiveUtc,
visibleFromAtUtc = utcRange.endExclusiveUtc.plusHours(9),
trigger = trigger,
status = CreatorRankingSnapshotJobStatus.PENDING,
lastError = null,
processingStartedAt = null,
processedAt = null
)
)
}!!
}
private fun markProcessing(jobId: Long) {
transactionTemplate.executeWithoutResult {
jobPort.markProcessing(jobId, LocalDateTime.now())
}
}
private fun markDone(jobId: Long) {
transactionTemplate.executeWithoutResult {
jobPort.markDone(jobId, LocalDateTime.now())
}
}
private fun markFailed(jobId: Long, message: String?) {
transactionTemplate.executeWithoutResult {
jobPort.markFailed(jobId, LocalDateTime.now(), message)
}
}
@Transactional
fun createManualJob(
aggregationStartAtUtc: LocalDateTime,
@@ -76,8 +110,10 @@ class CreatorRankingSnapshotJobService(
): CreatorRankingSnapshotJobRecord {
return jobPort.save(
CreatorRankingSnapshotJobRecord(
rankingType = CreatorRankingType.WEEKLY,
aggregationStartAtUtc = aggregationStartAtUtc,
aggregationEndAtUtc = aggregationEndAtUtc,
visibleFromAtUtc = aggregationEndAtUtc.plusHours(9),
trigger = CreatorRankingSnapshotJobTrigger.MANUAL,
status = CreatorRankingSnapshotJobStatus.PENDING,
lastError = null,