From 805f0a7219133f477b1e149e93b475db3bd56986 Mon Sep 17 00:00:00 2001 From: Jim Martens Date: Wed, 4 Oct 2023 08:08:53 +0200 Subject: [PATCH] Initialize scheduled tasks after application launch from database --- .../twomartens/timetable/MainApplication.kt | 14 ++------ .../bahnApi/model/db/BahnTimetable.kt | 2 +- .../bahnApi/model/db/ScheduledFetchTask.kt | 30 ++++++++++++++++ .../ScheduledFetchTaskRepository.kt | 6 ++++ .../bahnApi/tasks/DeleteScheduledTask.kt | 15 ++++++++ .../bahnApi/tasks/FetchTimetableTask.kt | 1 + .../timetable/service/ScheduledTaskService.kt | 34 +++++++++++++++++++ 7 files changed, 90 insertions(+), 12 deletions(-) create mode 100644 module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/ScheduledFetchTask.kt create mode 100644 module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/repository/ScheduledFetchTaskRepository.kt create mode 100644 module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/DeleteScheduledTask.kt create mode 100644 module-server/src/main/kotlin/de/twomartens/timetable/service/ScheduledTaskService.kt diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/MainApplication.kt b/module-server/src/main/kotlin/de/twomartens/timetable/MainApplication.kt index e1dcd0a..beb97dd 100644 --- a/module-server/src/main/kotlin/de/twomartens/timetable/MainApplication.kt +++ b/module-server/src/main/kotlin/de/twomartens/timetable/MainApplication.kt @@ -1,7 +1,6 @@ package de.twomartens.timetable -import de.twomartens.timetable.bahnApi.service.BahnApiService -import de.twomartens.timetable.bahnApi.service.BahnDatabaseService +import de.twomartens.timetable.service.ScheduledTaskService import mu.KotlinLogging import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.event.ApplicationReadyEvent @@ -9,23 +8,16 @@ import org.springframework.boot.runApplication import org.springframework.context.event.EventListener import org.springframework.data.mongodb.config.EnableMongoAuditing import org.springframework.scheduling.annotation.EnableScheduling -import java.time.LocalDate -import java.time.LocalTime -import java.time.Month @EnableMongoAuditing @EnableScheduling @SpringBootApplication open class MainApplication( - private val bahnApiService: BahnApiService, - private val bahnDatabaseService: BahnDatabaseService + private val scheduledTaskService: ScheduledTaskService ) { @EventListener(ApplicationReadyEvent::class) fun ready() { - val timetable = bahnApiService.fetchTimetable(8000207, - LocalDate.of(2023, Month.OCTOBER, 1), - LocalTime.of(3, 0)) - log.info { "bs" } + scheduledTaskService.initializeScheduledTasks() } companion object { diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/BahnTimetable.kt b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/BahnTimetable.kt index b8ff49d..2923360 100644 --- a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/BahnTimetable.kt +++ b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/BahnTimetable.kt @@ -12,7 +12,7 @@ import java.time.Instant import java.time.LocalDateTime @Document -@CompoundIndex(def = "{'eva': 1, 'dateTime': 1}") +@CompoundIndex(def = "{'eva': 1, 'dateTime': 1}", unique = true) data class BahnTimetable( var eva: Int, var dateTime: LocalDateTime, diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/ScheduledFetchTask.kt b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/ScheduledFetchTask.kt new file mode 100644 index 0000000..3a84546 --- /dev/null +++ b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/model/db/ScheduledFetchTask.kt @@ -0,0 +1,30 @@ +package de.twomartens.timetable.bahnApi.model.db + +import org.bson.types.ObjectId +import org.springframework.data.annotation.CreatedDate +import org.springframework.data.annotation.Id +import org.springframework.data.annotation.LastModifiedDate +import org.springframework.data.mongodb.core.index.CompoundIndex +import org.springframework.data.mongodb.core.mapping.Document +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime + +@Document +@CompoundIndex(def = "{'eva': 1, 'fetchedDate': 1, 'fetchedTime': 1", unique = true) +data class ScheduledFetchTask( + var eva: Int, + var fetchedDate: LocalDate, + var fetchedTime: LocalTime, + var scheduledExecutionDateTime: LocalDateTime +) { + @Id + var id: ObjectId = ObjectId() + + @CreatedDate + lateinit var created: Instant + + @LastModifiedDate + lateinit var lastModified: Instant +} diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/repository/ScheduledFetchTaskRepository.kt b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/repository/ScheduledFetchTaskRepository.kt new file mode 100644 index 0000000..952d092 --- /dev/null +++ b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/repository/ScheduledFetchTaskRepository.kt @@ -0,0 +1,6 @@ +package de.twomartens.timetable.bahnApi.repository + +import de.twomartens.timetable.bahnApi.model.db.ScheduledFetchTask +import org.springframework.data.mongodb.repository.MongoRepository + +interface ScheduledFetchTaskRepository : MongoRepository diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/DeleteScheduledTask.kt b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/DeleteScheduledTask.kt new file mode 100644 index 0000000..be3b8ed --- /dev/null +++ b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/DeleteScheduledTask.kt @@ -0,0 +1,15 @@ +package de.twomartens.timetable.bahnApi.tasks + +import de.twomartens.timetable.bahnApi.model.db.ScheduledFetchTask +import de.twomartens.timetable.bahnApi.repository.ScheduledFetchTaskRepository +import org.springframework.scheduling.annotation.Async + +@Async +open class DeleteScheduledTask( + private val scheduledFetchTaskRepository: ScheduledFetchTaskRepository, + private val scheduledFetchTask: ScheduledFetchTask +) : Runnable { + override fun run() { + scheduledFetchTaskRepository.delete(scheduledFetchTask) + } +} \ No newline at end of file diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/FetchTimetableTask.kt b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/FetchTimetableTask.kt index 2dd63cb..3183f9d 100644 --- a/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/FetchTimetableTask.kt +++ b/module-server/src/main/kotlin/de/twomartens/timetable/bahnApi/tasks/FetchTimetableTask.kt @@ -1,5 +1,6 @@ package de.twomartens.timetable.bahnApi.tasks +import de.twomartens.timetable.bahnApi.repository.ScheduledFetchTaskRepository import de.twomartens.timetable.bahnApi.service.BahnApiService import de.twomartens.timetable.bahnApi.service.BahnDatabaseService import org.springframework.scheduling.annotation.Async diff --git a/module-server/src/main/kotlin/de/twomartens/timetable/service/ScheduledTaskService.kt b/module-server/src/main/kotlin/de/twomartens/timetable/service/ScheduledTaskService.kt new file mode 100644 index 0000000..c7412c3 --- /dev/null +++ b/module-server/src/main/kotlin/de/twomartens/timetable/service/ScheduledTaskService.kt @@ -0,0 +1,34 @@ +package de.twomartens.timetable.service + +import de.twomartens.timetable.bahnApi.repository.ScheduledFetchTaskRepository +import de.twomartens.timetable.bahnApi.service.BahnApiService +import de.twomartens.timetable.bahnApi.service.BahnDatabaseService +import de.twomartens.timetable.bahnApi.tasks.DeleteScheduledTask +import de.twomartens.timetable.bahnApi.tasks.FetchTimetableTask +import de.twomartens.timetable.property.TimeProperties +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor +import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler +import org.springframework.stereotype.Service + +@Service +class ScheduledTaskService( + private val timeProperties: TimeProperties, + private val scheduledFetchTaskRepository: ScheduledFetchTaskRepository, + private val threadPoolTaskScheduler: ThreadPoolTaskScheduler, + private val bahnApiService: BahnApiService, + private val bahnDatabaseService: BahnDatabaseService, + private val threadPoolTaskExecutor: ThreadPoolTaskExecutor +) { + fun initializeScheduledTasks() { + val scheduledTasks = scheduledFetchTaskRepository.findAll() + scheduledTasks.forEach { + val zonedExecutionTime = it.scheduledExecutionDateTime + .atZone(timeProperties.defaultTimeZone) + val deleteTask = DeleteScheduledTask(scheduledFetchTaskRepository, it) + val timetableTask = FetchTimetableTask(it.eva, it.fetchedDate, it.fetchedTime, + bahnApiService, bahnDatabaseService, threadPoolTaskExecutor) + threadPoolTaskScheduler.schedule(timetableTask, zonedExecutionTime.toInstant()) + threadPoolTaskScheduler.schedule(deleteTask, zonedExecutionTime.toInstant()) + } + } +} \ No newline at end of file