From 0193e7d6a4b2e9bbfe42797773d702621353a409 Mon Sep 17 00:00:00 2001 From: vityaman Date: Fri, 17 May 2024 17:32:03 +0300 Subject: [PATCH] #63 Add logging --- .../LoggingPublicationCallbacks.kt | 12 +++++++++++ .../publication/LoggingPublicationConsumer.kt | 12 +++++++++++ .../core/publication/PublicationConsumer.kt | 5 +++-- .../core/publication/PublicationTask.kt | 21 +++++++++++++++++-- .../app/spring/logic/PublicationTest.kt | 7 ++++++- 5 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt create mode 100644 botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationConsumer.kt diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt new file mode 100644 index 0000000..a7a83ce --- /dev/null +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationCallbacks.kt @@ -0,0 +1,12 @@ +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}") }, + ) diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationConsumer.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationConsumer.kt new file mode 100644 index 0000000..22f623d --- /dev/null +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/LoggingPublicationConsumer.kt @@ -0,0 +1,12 @@ +package ru.vityaman.lms.botalka.core.publication + +import ru.vityaman.lms.botalka.core.logging.Log +import ru.vityaman.lms.botalka.core.model.Homework + +class LoggingPublicationConsumer( + private val log: Log, +) : PublicationConsumer { + override suspend fun accept(homework: Homework) { + log.warn("Published $homework") + } +} diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationConsumer.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationConsumer.kt index 163ba32..9491f0c 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationConsumer.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationConsumer.kt @@ -1,6 +1,7 @@ package ru.vityaman.lms.botalka.core.publication import ru.vityaman.lms.botalka.core.model.Homework -import java.util.function.Consumer -interface PublicationConsumer : Consumer +interface PublicationConsumer { + suspend fun accept(homework: Homework) +} diff --git a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationTask.kt b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationTask.kt index 054d971..7dc1a9d 100644 --- a/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationTask.kt +++ b/botalka/src/main/kotlin/ru/vityaman/lms/botalka/core/publication/PublicationTask.kt @@ -1,6 +1,7 @@ package ru.vityaman.lms.botalka.core.publication import kotlinx.coroutines.flow.toCollection +import ru.vityaman.lms.botalka.core.model.Homework import ru.vityaman.lms.botalka.core.storage.HomeworkStorage import ru.vityaman.lms.botalka.core.tx.TxEnv import java.time.Clock @@ -11,18 +12,34 @@ class PublicationTask( private val homeworks: HomeworkStorage, private val txEnv: TxEnv, private val clock: Clock, + private val callbacks: Callbacks = Callbacks(), ) : Runnable { - override suspend fun run() = + override suspend fun run() { + callbacks.onStart() homeworks.publishableAt(OffsetDateTime.now(clock)) .toCollection(mutableListOf()) .shuffled() + .also { callbacks.onReceived(it) } .forEach { id -> txEnv.transactional { val homework = homeworks.acquireById(id) + callbacks.onNext(homework) if (!homework.isPublished) { - consumer.accept(homework) + runCatching { consumer.accept(homework) } + .onSuccess { callbacks.onAccepted(homework) } + .onFailure { callbacks.onRejected(homework) } + .getOrThrow() homeworks.markPublished(homework.id) } } } + } + + data class Callbacks( + val onStart: suspend () -> Unit = {}, + val onReceived: suspend (List) -> Unit = {}, + val onNext: suspend (Homework) -> Unit = {}, + val onAccepted: suspend (Homework) -> Unit = {}, + val onRejected: suspend (Homework) -> Unit = {}, + ) } diff --git a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/logic/PublicationTest.kt b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/logic/PublicationTest.kt index c084f13..f09fc6a 100644 --- a/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/logic/PublicationTest.kt +++ b/botalka/src/test/kotlin/ru/vityaman/lms/botalka/app/spring/logic/PublicationTest.kt @@ -9,9 +9,11 @@ import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import ru.vityaman.lms.botalka.app.spring.BotalkaTestSuite import ru.vityaman.lms.botalka.app.spring.env.FakeClock +import ru.vityaman.lms.botalka.core.logging.Slf4jLog import ru.vityaman.lms.botalka.core.model.Homework import ru.vityaman.lms.botalka.core.publication.PublicationConsumer 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.OffsetDateTime @@ -65,13 +67,16 @@ class PublicationTest( val list = mutableSetOf() PublicationTask( consumer = object : PublicationConsumer { - override fun accept(homework: Homework) { + override suspend fun accept(homework: Homework) { list.add(homework.title.text) } }, homeworks = homeworks, txEnv = txEnv, clock = clock, + callbacks = loggingPublicationCallbacks( + Slf4jLog("Testing publisher"), + ), ).run() return list }