Adjustments

This commit is contained in:
Brage Skjønborg 2025-10-12 13:49:04 +02:00
parent 4b63d70443
commit 8993546cb3
8 changed files with 30 additions and 19 deletions

View File

@ -21,9 +21,12 @@ import java.time.format.DateTimeFormatter
object ZDS { object ZDS {
val gson = WGson.gson val gson = WGson.gson
fun Event.toPersisted(id: Long, persistedAt: LocalDateTime = LocalDateTime.now()): PersistedEvent { fun Event.toPersisted(id: Long, persistedAt: LocalDateTime = LocalDateTime.now()): PersistedEvent? {
val payloadJson = gson.toJson(this) val payloadJson = gson.toJson(this)
val eventName = this::class.simpleName ?: error("Missing class name") val eventName = this::class.simpleName ?: run {
println("Missing class name for event: $this")
return null
}
return PersistedEvent( return PersistedEvent(
id = id, id = id,
referenceId = referenceId, referenceId = referenceId,
@ -37,15 +40,21 @@ object ZDS {
/** /**
* Convert a PersistedEvent back to its original Event type using the event type registry and Gson for deserialization. * Convert a PersistedEvent back to its original Event type using the event type registry and Gson for deserialization.
*/ */
fun PersistedEvent.toEvent(): Event { fun PersistedEvent.toEvent(): Event? {
val clazz = EventTypeRegistry.resolve(event) val clazz = EventTypeRegistry.resolve(event)
?: error("Unknown event type: $event") ?: run {
println("Missing class name for event: $this")
return null
}
return gson.fromJson(data, clazz) return gson.fromJson(data, clazz)
} }
fun Task.toPersisted(id: Long, status: TaskStatus = TaskStatus.Pending, persistedAt: LocalDateTime = LocalDateTime.now()): PersistedTask { fun Task.toPersisted(id: Long, status: TaskStatus = TaskStatus.Pending, persistedAt: LocalDateTime = LocalDateTime.now()): PersistedTask? {
val payloadJson = gson.toJson(this) val payloadJson = gson.toJson(this)
val taskName = this::class.simpleName ?: error("Missing class name") val taskName = this::class.simpleName ?: run {
println("Missing class name for task: $this")
return null
}
return PersistedTask( return PersistedTask(
id = id, id = id,
referenceId = referenceId, referenceId = referenceId,

View File

@ -14,8 +14,8 @@ abstract class AbstractEventPoller(
private val dispatcher: EventDispatcher private val dispatcher: EventDispatcher
) { ) {
var lastSeenTime: LocalDateTime = LocalDateTime.MIN var lastSeenTime: LocalDateTime = LocalDateTime.MIN
var backoff = Duration.ofSeconds(2) open var backoff = Duration.ofSeconds(2)
private set protected set
private val maxBackoff = Duration.ofMinutes(1) private val maxBackoff = Duration.ofMinutes(1)
@ -42,7 +42,7 @@ abstract class AbstractEventPoller(
if (dispatchQueue.isProcessing(referenceId)) continue if (dispatchQueue.isProcessing(referenceId)) continue
val fullLog = eventStore.getPersistedEventsFor(referenceId) val fullLog = eventStore.getPersistedEventsFor(referenceId)
val events = fullLog.map { it.toEvent() } val events = fullLog.mapNotNull { it.toEvent() }
dispatchQueue.dispatch(referenceId, events, dispatcher) dispatchQueue.dispatch(referenceId, events, dispatcher)
lastSeenTime = fullLog.maxOf { it.persistedAt } lastSeenTime = fullLog.maxOf { it.persistedAt }

View File

@ -10,7 +10,8 @@ abstract class AbstractTaskPoller(
private val taskStore: TaskStore, private val taskStore: TaskStore,
private val reporterFactory: (Task) -> TaskReporter private val reporterFactory: (Task) -> TaskReporter
) { ) {
var backoff = Duration.ofSeconds(2)
open var backoff = Duration.ofSeconds(2)
protected set protected set
private val maxBackoff = Duration.ofMinutes(1) private val maxBackoff = Duration.ofMinutes(1)

View File

@ -15,7 +15,7 @@ import kotlin.coroutines.cancellation.CancellationException
* @param T The type of result produced by processing the task. * @param T The type of result produced by processing the task.
* @param reporter An instance of [TaskReporter] for reporting task status and events. * @param reporter An instance of [TaskReporter] for reporting task status and events.
*/ */
abstract class TaskListener<T>(val taskType: TaskType): TaskListenerImplementation<T> { abstract class TaskListener<T>(val taskType: TaskType = TaskType.CPU_INTENSIVE): TaskListenerImplementation<T> {
init { init {
TaskListenerRegistry.registerListener(this) TaskListenerRegistry.registerListener(this)

View File

@ -52,7 +52,7 @@ class EventDispatcherTest: TestBase() {
assertNotNull(produced) assertNotNull(produced)
val event = produced!!.toEvent() val event = produced!!.toEvent()
assertEquals(trigger.eventId, event.metadata.derivedFromId) assertEquals(trigger.eventId, event!!.metadata.derivedFromId)
assertTrue(event is DerivedEvent) assertTrue(event is DerivedEvent)
} }
@ -62,9 +62,10 @@ class EventDispatcherTest: TestBase() {
val trigger = TriggerEvent() val trigger = TriggerEvent()
val derived = DerivedEvent().derivedOf(trigger).toPersisted(1L, LocalDateTime.now()) val derived = DerivedEvent().derivedOf(trigger).toPersisted(1L, LocalDateTime.now())
eventStore.persist(derived.toEvent()) // simulate prior production
dispatcher.dispatch(trigger.referenceId, listOf(trigger, derived.toEvent())) eventStore.persist(derived!!.toEvent()!!) // simulate prior production
dispatcher.dispatch(trigger.referenceId, listOf(trigger, derived!!.toEvent()!!))
assertEquals(1, eventStore.all().size) // no new event produced assertEquals(1, eventStore.all().size) // no new event produced
} }
@ -86,7 +87,7 @@ class EventDispatcherTest: TestBase() {
val trigger = TriggerEvent() val trigger = TriggerEvent()
dispatcher.dispatch(trigger.referenceId, listOf(trigger)) dispatcher.dispatch(trigger.referenceId, listOf(trigger))
val replayContext = listOf(trigger) + eventStore.all().map { it.toEvent() } val replayContext = listOf(trigger) + eventStore.all().mapNotNull { it.toEvent() }
dispatcher.dispatch(trigger.referenceId, replayContext) dispatcher.dispatch(trigger.referenceId, replayContext)

View File

@ -19,7 +19,7 @@ class InMemoryEventStore : EventStore {
override fun persist(event: Event) { override fun persist(event: Event) {
val persistedEvent = event.toPersisted(nextId++, LocalDateTime.now()) val persistedEvent = event.toPersisted(nextId++, LocalDateTime.now())
persisted += persistedEvent persisted += persistedEvent!!
} }
fun all(): List<PersistedEvent> = persisted fun all(): List<PersistedEvent> = persisted

View File

@ -15,7 +15,7 @@ open class InMemoryTaskStore : TaskStore {
override fun persist(task: Task) { override fun persist(task: Task) {
val persistedTask = task.toPersisted(nextId++) val persistedTask = task.toPersisted(nextId++)
tasks += persistedTask tasks += persistedTask!!
} }
override fun findByTaskId(taskId: UUID) = tasks.find { it.taskId == taskId } override fun findByTaskId(taskId: UUID) = tasks.find { it.taskId == taskId }

View File

@ -32,7 +32,7 @@ class ZDSTest {
val echo = EchoEvent("hello") val echo = EchoEvent("hello")
val persisted = echo.toPersisted(id = 1L) val persisted = echo.toPersisted(id = 1L)
val restored = persisted.toEvent() val restored = persisted!!.toEvent()
assert(restored is EchoEvent) assert(restored is EchoEvent)
assert((restored as EchoEvent).data == "hello") assert((restored as EchoEvent).data == "hello")
@ -53,7 +53,7 @@ class ZDSTest {
val persisted = task.toPersisted(id = 1L) val persisted = task.toPersisted(id = 1L)
val restored = persisted.toTask() val restored = persisted!!.toTask()
assert(restored is TestTask) assert(restored is TestTask)
assert((restored as TestTask).data == "Potato") assert((restored as TestTask).data == "Potato")
assert(restored.metadata.created == task.metadata.created) assert(restored.metadata.created == task.metadata.created)