Skip to content

Commit

Permalink
🐛 Fjerner mer bruk av global state i Kommandofabrikk
Browse files Browse the repository at this point in the history
Siden listene med observers var et felt i kommandofabrikken, kunne både
behandling av meldinger fra rapiden og API-kall (oppdaterPerson) legge
til utgående meldinger i/via observerne. Når publiserOppsamledeMeldinger
ble kalt, sendte den ut behov for forskjellige personer på samme nøkkel
og med samme meldingId. Dette gjorde at feil context ble gjenopptatt
når svaret på behov ble behandlet.

Co-authored-by: Øydis Kind Refsum <[email protected]>
  • Loading branch information
havstein and oydisrefsum committed Aug 27, 2024
1 parent 3a32c38 commit 1b0092a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 21 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -115,15 +115,6 @@ internal class Kommandofabrikk(
private val avviksvurderingDao = AvviksvurderingDao(dataSource)
private val metrikkDao = MetrikkDao(dataSource)
private val oppgaveService: OppgaveService by lazy { oppgaveService() }
private val observers: MutableList<CommandContextObserver> = mutableListOf()

internal fun nyObserver(vararg observers: CommandContextObserver) {
this.observers.addAll(observers)
}

internal fun avregistrerObserver(vararg observers: CommandContextObserver) {
this.observers.removeAll(observers.toSet())
}

internal fun avviksvurdering(avviksvurdering: AvviksvurderingDto) {
avviksvurderingDao.lagre(avviksvurdering)
Expand Down Expand Up @@ -383,20 +374,26 @@ internal class Kommandofabrikk(
OppdaterSnapshotCommand(snapshotClient, snapshotDao, personmelding.fødselsnummer(), personDao)

// Kanskje prøve å få håndtering av søknad inn i samme flyt som andre kommandokjeder
internal fun iverksettSøknadSendt(melding: SøknadSendt) {
iverksett(søknadSendt(melding), melding.id, nyContext(melding.id))
internal fun iverksettSøknadSendt(
melding: SøknadSendt,
commandContextObservers: CommandContextObserver,
) {
iverksett(søknadSendt(melding), melding.id, nyContext(melding.id), setOf(commandContextObservers))
}

private fun nyContext(meldingId: UUID) =
CommandContext(UUID.randomUUID()).apply {
opprett(commandContextDao, meldingId)
}

internal fun lagKommandostarter(commandContext: CommandContext): Kommandostarter {
internal fun lagKommandostarter(
commandContext: CommandContext,
commandContextObservers: Set<CommandContextObserver>,
): Kommandostarter {
return { kommandooppretter ->
val melding = this
this@Kommandofabrikk.kommandooppretter()?.let { command ->
iverksett(command, melding.id, commandContext)
iverksett(command, melding.id, commandContext, commandContextObservers)
}
}
}
Expand All @@ -405,8 +402,9 @@ internal class Kommandofabrikk(
command: Command,
meldingId: UUID,
commandContext: CommandContext,
commandContextObservers: Collection<CommandContextObserver>,
) {
observers.forEach { commandContext.nyObserver(it) }
commandContextObservers.forEach { commandContext.nyObserver(it) }
val contextId = commandContext.id()
withMDC(
mapOf("contextId" to contextId.toString()),
Expand All @@ -426,7 +424,7 @@ internal class Kommandofabrikk(
command.undo(commandContext)
throw err
} finally {
observers.forEach { commandContext.avregistrerObserver(it) }
commandContextObservers.forEach { commandContext.avregistrerObserver(it) }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -370,10 +370,8 @@ internal class MeldingMediator(
sikkerlogg.info("Melding SøknadSendt mottatt:\n${melding.toJson()}")
meldingDao.lagre(melding)
val commandContextTilstandMediator = CommandContextTilstandMediator()
kommandofabrikk.nyObserver(commandContextTilstandMediator)
kommandofabrikk.iverksettSøknadSendt(melding)
kommandofabrikk.iverksettSøknadSendt(melding, commandContextTilstandMediator)
commandContextTilstandMediator.publiserTilstandsendringer(melding, messageContext)
kommandofabrikk.avregistrerObserver(commandContextTilstandMediator)
logg.info("Melding SøknadSendt lest")
sikkerlogg.info("Melding SøknadSendt lest")
}
Expand Down Expand Up @@ -442,13 +440,17 @@ internal class MeldingMediator(
val commandContextTilstandMediator = CommandContextTilstandMediator()
val vedtakFattetMelder = VedtakFattetMelder(messageContext)
try {
kommandofabrikk.nyObserver(utgåendeMeldingerMediator, commandContextTilstandMediator)
personRepository.brukPersonHvisFinnes(melding.fødselsnummer()) {
this.nyObserver(vedtakFattetMelder)
logg.info("Personen finnes i databasen, behandler melding $meldingnavn")
sikkerlogg.info("Personen finnes i databasen, behandler melding $meldingnavn")

melding.behandle(this, kommandofabrikk.lagKommandostarter(commandContext))
val kommandostarter =
kommandofabrikk.lagKommandostarter(
commandContext,
setOf(utgåendeMeldingerMediator, commandContextTilstandMediator),
)
melding.behandle(this, kommandostarter)
}
if (melding is VedtakFattet) melding.doFinally(vedtakDao) // Midlertidig frem til spesialsak ikke er en ting lenger
vedtakFattetMelder.publiserUtgåendeMeldinger()
Expand All @@ -457,7 +459,6 @@ internal class MeldingMediator(
logg.error("Feil ved behandling av melding $meldingnavn", e.message, e)
throw e
} finally {
kommandofabrikk.avregistrerObserver(utgåendeMeldingerMediator, commandContextTilstandMediator)
commandContextTilstandMediator.publiserTilstandsendringer(melding, messageContext)
logg.info("Melding $meldingnavn lest")
sikkerlogg.info("Melding $meldingnavn lest")
Expand Down

0 comments on commit 1b0092a

Please sign in to comment.