Skip to content

Commit

Permalink
#63 Add spring scheduled task
Browse files Browse the repository at this point in the history
  • Loading branch information
vityaman committed May 17, 2024
1 parent 0193e7d commit 6ff7902
Show file tree
Hide file tree
Showing 7 changed files with 59 additions and 16 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@ import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration
import org.springframework.boot.runApplication
import org.springframework.context.annotation.Bean
import org.springframework.scheduling.annotation.EnableScheduling
import java.time.Clock

@SpringBootApplication(exclude = [JooqAutoConfiguration::class])
@EnableScheduling
class BotalkaApplication {
@Bean
fun clock() = Clock.systemUTC()
fun clock(): Clock = Clock.systemUTC()
}

fun main(args: Array<String>) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ru.vityaman.lms.botalka.app.spring.task

import kotlinx.coroutines.runBlocking
import org.springframework.scheduling.annotation.Scheduled
import org.springframework.stereotype.Component
import ru.vityaman.lms.botalka.core.logging.Slf4jLog
import ru.vityaman.lms.botalka.core.publication.LoggingPublicationConsumer
import ru.vityaman.lms.botalka.core.publication.PublicationTask
import ru.vityaman.lms.botalka.core.publication.loggingPublicationCallbacks
import ru.vityaman.lms.botalka.core.storage.HomeworkStorage
import ru.vityaman.lms.botalka.core.tx.TxEnv
import java.time.Clock
import java.util.concurrent.TimeUnit

@Component
class SpringPublicationTask(
homeworks: HomeworkStorage,
txEnv: TxEnv,
clock: Clock,
) {
private val logic = PublicationTask(
consumer = LoggingPublicationConsumer(Slf4jLog("PublicationConsumer")),
homeworks = homeworks,
txEnv = txEnv,
clock = clock,
callbacks = loggingPublicationCallbacks(Slf4jLog("PublicationTask")),
)

@Scheduled(
fixedRateString = "\${task.scheduled.publication.precision-seconds}",
initialDelayString = "\${task.scheduled.publication.precision-seconds}",
timeUnit = TimeUnit.SECONDS,
)
fun run(): Unit = runBlocking { logic.run() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@ package ru.vityaman.lms.botalka.core.publication

import ru.vityaman.lms.botalka.core.logging.Log

fun loggingPublicationCallbacks(log: Log) =
PublicationTask.Callbacks(
onStart = { log.info("Starting...") },
onReceived = { log.info("Received ${it.size} homeworks") },
onNext = { log.info("Publishing homework with id ${it.id}...") },
onAccepted = { log.info("Published homework with id ${it.id}") },
onRejected = { log.info("Failed to publish homework with id ${it.id}") },
)
fun loggingPublicationCallbacks(log: Log) = PublicationTask.Callbacks(
onStart = { log.info("Starting...") },
onReceived = { log.info("Received ${it.size} homeworks") },
onNext = { log.info("Publishing homework with id ${it.id}...") },
onAccepted = { log.info("Published homework with id ${it.id}") },
onRejected = { log.info("Failed to publish homework with id ${it.id}") },
)
Original file line number Diff line number Diff line change
Expand Up @@ -47,16 +47,15 @@ class JooqHomeworkStorage(

override suspend fun publishableAt(
moment: OffsetDateTime,
): Flow<Homework.Id> {
return database.flow {
): Flow<Homework.Id> =
database.flow {
select(HOMEWORK.ID)
.from(HOMEWORK)
.where(
HOMEWORK.PUBLICATION_MOMENT.lessOrEqual(moment)
.and(HOMEWORK.IS_PUBLISHED.notEqual(true))
.and(HOMEWORK.IS_PUBLISHED.notEqual(true)),
)
}.map { Homework.Id(it["id"]!! as Int) }
}

override suspend fun markPublished(id: Homework.Id) =
database.only {
Expand Down
6 changes: 5 additions & 1 deletion botalka/src/main/resources/application-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,8 @@ external:
clientId: fake-yandex-client-id
clientSecret: fake-yandex-client-secret
login:
url: http://localhost:8080/fake/external/service/yandex/login
url: http://localhost:8080/fake/external/service/yandex/login
task:
scheduled:
publication:
precision-seconds: 66666
6 changes: 5 additions & 1 deletion botalka/src/main/resources/application.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,4 +53,8 @@ external:
clientId: ${LMS_YANDEX_CLIENT_ID}
clientSecret: ${LMS_YANDEX_CLIENT_SECRET}
login:
url: https://login.yandex.ru
url: https://login.yandex.ru
task:
scheduled:
publication:
precision-seconds: 60
2 changes: 1 addition & 1 deletion config/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ complexity:
LongParameterList:
active: true
functionThreshold: 4
constructorThreshold: 5
constructorThreshold: 6
MethodOverloading:
active: true
NamedArguments:
Expand Down

0 comments on commit 6ff7902

Please sign in to comment.