From eb9ad2ef317b6d84d0b898fd02d721062a7b15aa Mon Sep 17 00:00:00 2001 From: Ken Gullaksen Date: Tue, 14 Jan 2025 13:36:36 +0100 Subject: [PATCH] =?UTF-8?q?send=20hendelser=20i=20tx=20Uten=20dette=20har?= =?UTF-8?q?=20vi=20et=20potensielt=20case=20hvor=20meldinger=20blir=20mist?= =?UTF-8?q?et.=20Siden=20man=20gj=C3=B8r=20delete=20returning=20s=C3=A5=20?= =?UTF-8?q?er=20det=20viktig=20at=20vi=20sender=20alle=20meldinger=20p?= =?UTF-8?q?=C3=A5=20kafka=20f=C3=B8r=20commit.=20Dersom=20det=20blir=20en?= =?UTF-8?q?=20feil=20vil=20det=20bli=20muligens=20bli=20sendt=20dobbelt=20?= =?UTF-8?q?opp,=20men=20det=20er=20bedre=20enn=20ingen.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../notifikasjon/infrastruktur/Database.kt | 2 +- .../SkedulertUtg\303\245ttRepository.kt" | 71 +++++++++++-------- .../SkedulertUtg\303\245ttService.kt" | 5 +- 3 files changed, 46 insertions(+), 32 deletions(-) diff --git a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/Database.kt b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/Database.kt index 614040c4e..41840254f 100644 --- a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/Database.kt +++ b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/infrastruktur/Database.kt @@ -158,7 +158,7 @@ class Database private constructor( suspend fun transaction( rollback: (e: Exception) -> T = { throw it }, - body: Transaction.() -> T, + body: suspend Transaction.() -> T, ): T = dataSource.withConnection { connection -> val savedAutoCommit = connection.autoCommit diff --git "a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttRepository.kt" "b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttRepository.kt" index d66a59bb8..ef0e7a0d1 100644 --- "a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttRepository.kt" +++ "b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttRepository.kt" @@ -173,49 +173,64 @@ class SkedulertUtgåttRepository( } } - suspend fun hentOgFjernAlleUtgåtteOppgaver(localDateNow: LocalDate) = database.nonTransactionalExecuteQuery( - """ + suspend fun hentOgFjernAlleUtgåtteOppgaver( + localDateNow: LocalDate, + action: suspend (Oppgave) -> Unit + ) = database.transaction { + executeQuery( + """ delete from skedulert_utgatt as s using oppgave as o where o.oppgave_id = s.aggregat_id and s.aggregat_type = ? and o.frist < ? returning * """, { - text(AggregatType.OPPGAVE.name) - localDateAsText(localDateNow) - }) { - Oppgave( - oppgaveId = getUUID("oppgave_id"), - frist = getLocalDate("frist"), - virksomhetsnummer = getString("virksomhetsnummer"), - produsentId = getString("produsent_id"), - ) + text(AggregatType.OPPGAVE.name) + localDateAsText(localDateNow) + }) { + Oppgave( + oppgaveId = getUUID("oppgave_id"), + frist = getLocalDate("frist"), + virksomhetsnummer = getString("virksomhetsnummer"), + produsentId = getString("produsent_id"), + ) + }.forEach { + action(it) + } } - suspend fun hentOgFjernAlleAvholdteKalenderavtaler(localDateTimeNow: LocalDateTime) = - database.nonTransactionalExecuteQuery( - """ + + suspend fun hentOgFjernAlleAvholdteKalenderavtaler( + localDateTimeNow: LocalDateTime, + action: suspend (Kalenderavtale) -> Unit + ) = + database.transaction { + executeQuery( + """ delete from skedulert_utgatt as s using kalenderavtale as k where k.kalenderavtale_id = s.aggregat_id and s.aggregat_type = ? and k.start_tidspunkt < ? returning * """, { - text(AggregatType.KALENDERAVTALE.name) - localDateTimeAsText(localDateTimeNow) - }) { - Kalenderavtale( - kalenderavtaleId = getUUID("kalenderavtale_id"), - startTidspunkt = getLocalDateTime("start_tidspunkt"), - virksomhetsnummer = getString("virksomhetsnummer"), - tilstand = getString("tilstand").let { KalenderavtaleTilstand.valueOf(it) }, - produsentId = getString("produsent_id"), - merkelapp = getString("merkelapp"), - grupperingsid = getString("grupperingsid"), - opprettetTidspunkt = Instant.parse( - getString("opprettet_tidspunkt"), + text(AggregatType.KALENDERAVTALE.name) + localDateTimeAsText(localDateTimeNow) + }) { + Kalenderavtale( + kalenderavtaleId = getUUID("kalenderavtale_id"), + startTidspunkt = getLocalDateTime("start_tidspunkt"), + virksomhetsnummer = getString("virksomhetsnummer"), + tilstand = getString("tilstand").let { KalenderavtaleTilstand.valueOf(it) }, + produsentId = getString("produsent_id"), + merkelapp = getString("merkelapp"), + grupperingsid = getString("grupperingsid"), + opprettetTidspunkt = Instant.parse( + getString("opprettet_tidspunkt"), + ) ) - ) + }.forEach { + action(it) + } } private suspend fun upsertSkedulertUtgåttOppgave(oppgave: Oppgave) = database.transaction { diff --git "a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttService.kt" "b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttService.kt" index 5d55bf199..a33e714e6 100644 --- "a/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttService.kt" +++ "b/app/src/main/kotlin/no/nav/arbeidsgiver/notifikasjon/skedulert_utg\303\245tt/SkedulertUtg\303\245ttService.kt" @@ -19,8 +19,7 @@ class SkedulertUtgåttService( private val osloTid: OsloTid = OsloTidImpl ) { suspend fun settOppgaverUtgåttBasertPåFrist(now: LocalDate = osloTid.localDateNow()) { - val utgåttFrist = repository.hentOgFjernAlleUtgåtteOppgaver(now) - utgåttFrist.forEach { utgått -> + repository.hentOgFjernAlleUtgåtteOppgaver(now) { utgått -> val fristLocalDateTime = LocalDateTime.of(utgått.frist, LocalTime.MAX) hendelseProdusent.send(HendelseModel.OppgaveUtgått( virksomhetsnummer = utgått.virksomhetsnummer, @@ -36,7 +35,7 @@ class SkedulertUtgåttService( } suspend fun settKalenderavtalerAvholdtBasertPåTidspunkt(now: LocalDateTime = osloTid.localDateTimeNow()) { - repository.hentOgFjernAlleAvholdteKalenderavtaler(now).forEach { avholdt -> + repository.hentOgFjernAlleAvholdteKalenderavtaler(now) { avholdt -> hendelseProdusent.send(HendelseModel.KalenderavtaleOppdatert( virksomhetsnummer = avholdt.virksomhetsnummer, notifikasjonId = avholdt.kalenderavtaleId,