diff --git "a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/error/Rekj\303\270rSenereException.kt" "b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/error/Rekj\303\270rSenereException.kt" index 331cd099..49beeb30 100644 --- "a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/error/Rekj\303\270rSenereException.kt" +++ "b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/error/Rekj\303\270rSenereException.kt" @@ -4,3 +4,6 @@ import java.time.LocalDateTime data class RekjørSenereException(val årsak: String, val triggerTid: LocalDateTime) : RuntimeException("Rekjører senere - triggerTid=$triggerTid") + +data class MaxAntallRekjøringerException(val maxAntallRekjøring: Int) : + RuntimeException("Nådd max antall rekjøring - $maxAntallRekjøring") diff --git a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskService.kt b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskService.kt index e27a25e0..95a919f3 100644 --- a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskService.kt +++ b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskService.kt @@ -157,6 +157,10 @@ class TaskService internal constructor( return taskLoggRepository.countByTaskIdAndType(taskId, Loggtype.FEILET) } + fun antallGangerPlukket(taskId: Long): Int { + return taskLoggRepository.countByTaskIdAndType(taskId, Loggtype.PLUKKET) + } + @Transactional internal fun avvikshåndter(task: Task, avvikstype: Avvikstype, årsak: String, endretAv: String): Task { val taskLogg = TaskLogg( diff --git a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskWorker.kt b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskWorker.kt index a21a87c6..a86cb058 100644 --- a/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskWorker.kt +++ b/prosessering-core/src/main/kotlin/no/nav/familie/prosessering/internal/TaskWorker.kt @@ -8,6 +8,7 @@ import no.nav.familie.prosessering.TaskStepBeskrivelse import no.nav.familie.prosessering.domene.Status import no.nav.familie.prosessering.domene.Task import no.nav.familie.prosessering.domene.TaskLogg.Companion.BRUKERNAVN_NÅR_SIKKERHETSKONTEKST_IKKE_FINNES +import no.nav.familie.prosessering.error.MaxAntallRekjøringerException import no.nav.familie.prosessering.error.RekjørSenereException import org.slf4j.LoggerFactory import org.springframework.aop.framework.AopProxyUtils @@ -46,8 +47,10 @@ class TaskWorker( } taskStepMap = tasksTilTaskStepBeskrivelse.entries.associate { it.value.taskStepType to it.key } maxAntallFeilMap = tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to it.maxAntallFeil } - triggerTidVedFeilMap = tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to it.triggerTidVedFeilISekunder } - settTilManuellOppfølgningVedFeil = tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to it.settTilManuellOppfølgning } + triggerTidVedFeilMap = + tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to it.triggerTidVedFeilISekunder } + settTilManuellOppfølgningVedFeil = + tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to it.settTilManuellOppfølgning } feiltellereForTaskSteps = tasksTilTaskStepBeskrivelse.values.associate { it.taskStepType to Metrics.counter( "mottak.feilede.tasks", @@ -96,13 +99,39 @@ class TaskWorker( fun rekjørSenere(taskId: Long, e: RekjørSenereException) { log.info("Rekjører task=$taskId senere, triggerTid=${e.triggerTid}") secureLog.info("Rekjører task=$taskId senere, årsak=${e.årsak}", e) - val taskMedNyTriggerTid = taskService.findById(taskId) - .medTriggerTid(e.triggerTid) - taskService.klarTilPlukk( - taskMedNyTriggerTid, - endretAv = BRUKERNAVN_NÅR_SIKKERHETSKONTEKST_IKKE_FINNES, - melding = e.årsak, - ) + + val taskMedNyTriggerTid = taskService.findById(taskId).medTriggerTid(e.triggerTid) + + val maxAntallFeil = finnMaxAntallFeil(taskMedNyTriggerTid.type) + val antallGangerRekjørt = taskService.antallGangerPlukket(taskId) + + if (antallGangerRekjørt >= maxAntallFeil) { + val settTilManuellOppfølgning = finnSettTilManuellOppfølgning(taskMedNyTriggerTid.type) + val taskFeil = TaskFeil(taskMedNyTriggerTid, MaxAntallRekjøringerException(maxAntallFeil)) + + val feiletTask = taskService.feilet( + task = taskMedNyTriggerTid, + feil = taskFeil, + tidligereAntallFeil = antallGangerRekjørt, + maxAntallFeil = maxAntallFeil, + settTilManuellOppfølgning = settTilManuellOppfølgning, + ) + // lager metrikker på tasks som har feilet max antall ganger. + if (feiletTask.status == Status.FEILET || feiletTask.status == Status.MANUELL_OPPFØLGING) { + finnFeilteller(feiletTask.type).increment() + log.error( + "Task ${feiletTask.id} av type ${feiletTask.type} har feilet/satt til manuell oppfølgning. " + + "Sjekk familie-prosessering for detaljer", + ) + } + secureLog.info("Feilhåndtering lagret ok {}", feiletTask) + } else { + taskService.klarTilPlukk( + taskMedNyTriggerTid, + endretAv = BRUKERNAVN_NÅR_SIKKERHETSKONTEKST_IKKE_FINNES, + melding = e.årsak, + ) + } } @Transactional(propagation = Propagation.REQUIRES_NEW)