From 3a85917f97f2459fc4c1317275887fb2b65f5672 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 27 Sep 2023 14:40:14 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20KJob=E3=81=8CMongoDB=E3=81=A7=E3=82=82?= =?UTF-8?q?=E5=8B=95=E3=81=8F=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 1 + .../service/job/KJobJobQueueParentService.kt | 2 ++ .../service/job/KJobJobQueueWorkerService.kt | 4 ++- .../job/KJobMongoJobQueueWorkerService.kt | 31 +++++++++++++++++++ .../job/KjobMongoJobQueueParentService.kt | 27 ++++++++++++++++ src/main/resources/application.yml | 2 ++ 6 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/dev/usbharu/hideout/service/job/KJobMongoJobQueueWorkerService.kt create mode 100644 src/main/kotlin/dev/usbharu/hideout/service/job/KjobMongoJobQueueParentService.kt diff --git a/build.gradle.kts b/build.gradle.kts index c27ebaf6..ae1ed371 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -128,6 +128,7 @@ dependencies { implementation("org.drewcarlson:kjob-core:0.6.0") + implementation("org.drewcarlson:kjob-mongo:0.6.0") testImplementation("org.slf4j:slf4j-simple:2.0.7") detektPlugins("io.gitlab.arturbosch.detekt:detekt-formatting:1.22.0") diff --git a/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueParentService.kt b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueParentService.kt index e7d9fc30..72456c1a 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueParentService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueParentService.kt @@ -7,9 +7,11 @@ import kjob.core.dsl.ScheduleContext import kjob.core.kjob import org.jetbrains.exposed.sql.Database import org.slf4j.LoggerFactory +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.stereotype.Service @Service +@ConditionalOnProperty(name = ["hideout.job-queue.type"], havingValue = "rdb") class KJobJobQueueParentService(private val database: Database) : JobQueueParentService { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueWorkerService.kt b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueWorkerService.kt index 5b011424..7db86934 100644 --- a/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueWorkerService.kt +++ b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobJobQueueWorkerService.kt @@ -5,11 +5,13 @@ import kjob.core.dsl.JobRegisterContext import kjob.core.dsl.KJobFunctions import kjob.core.kjob import org.jetbrains.exposed.sql.Database +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty import org.springframework.stereotype.Service import dev.usbharu.hideout.domain.model.job.HideoutJob as HJ import kjob.core.dsl.JobContextWithProps as JCWP @Service +@ConditionalOnProperty(name = ["hideout.job-queue.type"], havingValue = "rdb", matchIfMissing = true) class KJobJobQueueWorkerService(private val database: Database) : JobQueueWorkerService { val kjob by lazy { @@ -17,7 +19,7 @@ class KJobJobQueueWorkerService(private val database: Database) : JobQueueWorker connectionDatabase = database nonBlockingMaxJobs = 10 blockingMaxJobs = 10 - jobExecutionPeriodInSeconds = 10 + jobExecutionPeriodInSeconds = 1 }.start() } diff --git a/src/main/kotlin/dev/usbharu/hideout/service/job/KJobMongoJobQueueWorkerService.kt b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobMongoJobQueueWorkerService.kt new file mode 100644 index 00000000..b0f13ab2 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/service/job/KJobMongoJobQueueWorkerService.kt @@ -0,0 +1,31 @@ +package dev.usbharu.hideout.service.job + +import kjob.core.dsl.JobRegisterContext +import kjob.core.dsl.KJobFunctions +import kjob.core.kjob +import kjob.mongo.Mongo +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.stereotype.Service +import dev.usbharu.hideout.domain.model.job.HideoutJob as HJ +import kjob.core.dsl.JobContextWithProps as JCWP + +@Service +@ConditionalOnProperty(name = ["hideout.job-queue.type"], havingValue = "nosql") +class KJobMongoJobQueueWorkerService : JobQueueWorkerService { + val kjob by lazy { + kjob(Mongo) { + connectionString = "mongodb://localhost" + nonBlockingMaxJobs = 10 + blockingMaxJobs = 10 + jobExecutionPeriodInSeconds = 1 + }.start() + } + + override fun init( + defines: List>.(HJ) -> KJobFunctions>>> + ) { + defines.forEach { job -> + kjob.register(job.first, job.second) + } + } +} diff --git a/src/main/kotlin/dev/usbharu/hideout/service/job/KjobMongoJobQueueParentService.kt b/src/main/kotlin/dev/usbharu/hideout/service/job/KjobMongoJobQueueParentService.kt new file mode 100644 index 00000000..f76e7e18 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/service/job/KjobMongoJobQueueParentService.kt @@ -0,0 +1,27 @@ +package dev.usbharu.hideout.service.job + +import kjob.core.Job +import kjob.core.dsl.ScheduleContext +import kjob.core.kjob +import kjob.mongo.Mongo +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.stereotype.Service + +@Service +@ConditionalOnProperty(name = ["hideout.job-queue.type"], havingValue = "nosql") +class KjobMongoJobQueueParentService : JobQueueParentService { + override fun init(jobDefines: List) = Unit + + private val kjob = kjob(Mongo) { + connectionString = "mongodb://localhost" + databaseName = "kjob" + jobCollection = "kjob-jobs" + lockCollection = "kjob-locks" + expireLockInMinutes = 5L + isWorker = false + }.start() + + override suspend fun schedule(job: J, block: ScheduleContext.(J) -> Unit) { + kjob.schedule(job, block) + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 37a09f1e..e764c7cf 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -5,6 +5,8 @@ hideout: driver: "org.h2.Driver" user: "" password: "" + job-queue: + type: "nosql" spring: jackson: serialization: