Skip to content

Commit

Permalink
Add feature for sleeping threads that do nothing
Browse files Browse the repository at this point in the history
  • Loading branch information
jacob-meidell committed Oct 30, 2024
1 parent a99562c commit babe8ca
Show file tree
Hide file tree
Showing 13 changed files with 310 additions and 66 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.br
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.brev.metrics.BrevProcessingMetricsFeilmåling
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.brev.metrics.BrevProcessingMetrikker
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.NavUnleashConfig
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.UnleashWrapper
import org.slf4j.LoggerFactory
Expand All @@ -13,25 +14,33 @@ class BrevProcessingTask(
private val brevProcessingMetricsMåling: BrevProcessingMetrikker,
private val brevProcessingMetricsFeilmåling: BrevProcessingMetricsFeilmåling,
private val datasourceReadinessCheck: DatasourceReadinessCheck,
private val timeLock: TimeLock,
) : Runnable {

companion object {
private val log = LoggerFactory.getLogger(this::class.java)!!
}

init {
log.info("Starting new thread to process brev")
}

override fun run() {
while (true) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.BREV) && datasourceReadinessCheck.isReady()) {
brevProcessingMetricsMåling.oppdater { service.process() }
}
} catch (exception: Throwable) {
brevProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
if (timeLock.isOpen()) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.BREV) && datasourceReadinessCheck.isReady()) {
brevProcessingMetricsMåling.oppdater {
val result = service.process()
if (result == null) {
//ingenting utført, utsett
Thread.sleep(timeLock.lock())
} else {
timeLock.open()
}
result
}
}
} catch (exception: Throwable) {
brevProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
}
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.bre
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.brev.model.BrevProcessingTask
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.brev.model.BrevService
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.UnleashWrapper
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
import java.time.Clock
import java.time.Duration

@Configuration
class BrevConfig {
Expand All @@ -27,7 +30,12 @@ class BrevConfig {
unleash = unleash,
brevProcessingMetricsMåling = brevProcessingMetricsMåling,
brevProcessingMetricsFeilmåling = brevProcessingMetricsFeilmåling,
datasourceReadinessCheck = datasourceReadinessCheck
datasourceReadinessCheck = datasourceReadinessCheck,
timeLock = TimeLock(
initialDelay = Duration.ofSeconds(4),
maxDelay = Duration.ofSeconds(20),
clock = Clock.systemUTC()
)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config

import org.apache.commons.lang3.ObjectUtils.min
import java.time.Clock
import java.time.Duration
import java.time.Instant
import java.util.concurrent.atomic.AtomicLong

data class TimeLock(
private val initialDelay: Duration,
private val maxDelay: Duration,
private val clock: Clock
) {
private var delayUntil: Instant = Instant.now(clock).plusSeconds(initialDelay.toSeconds())
private var count = AtomicLong(0)

fun isOpen(): Boolean {
return delayUntil <= Instant.now(clock)
}

fun lock(): Duration {
val now = Instant.now(clock)
val toAdd = maxDelay.dividedBy(10).multipliedBy(count.incrementAndGet()).toSeconds()
val newUntil = now.plusSeconds(toAdd)
val maxUntil = now.plusSeconds(maxDelay.toSeconds())
delayUntil = min(newUntil, maxUntil)
return Duration.between(now, delayUntil)
}

fun open() {
delayUntil = Instant.now(clock)
}
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.model

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.metrics.GodskrivProcessingMetricsFeilmåling
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.metrics.GodskrivProcessingMetrikker
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.NavUnleashConfig
Expand All @@ -13,27 +14,33 @@ class GodskrivOpptjeningProcessingTask(
private val godskrivProcessingMetricsMåling: GodskrivProcessingMetrikker,
private val godskrivProcessingMetricsFeilmåling: GodskrivProcessingMetricsFeilmåling,
private val datasourceReadinessCheck: DatasourceReadinessCheck,
private val timeLock: TimeLock,
) : Runnable {

companion object {
private val log = LoggerFactory.getLogger(this::class.java)!!
}

init {
log.info("Starting new thread to process godskriv opptjening")
}

override fun run() {
while (true) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.GODSKRIV) && datasourceReadinessCheck.isReady()) {
godskrivProcessingMetricsMåling.oppdater {
service.process()
if (timeLock.isOpen()) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.GODSKRIV) && datasourceReadinessCheck.isReady()) {
godskrivProcessingMetricsMåling.oppdater {
val result = service.process()
if (result == null) {
//ingenting utført, utsett
Thread.sleep(timeLock.lock())
} else {
timeLock.open()
}
result
}
}
} catch (exception: Throwable) {
godskrivProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing: ${exception::class.qualifiedName}")
}
}
} catch (exception: Throwable) {
godskrivProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing: ${exception::class.qualifiedName}")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.go

import io.micrometer.core.instrument.MeterRegistry
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.metrics.GodskrivProcessingMetricsFeilmåling
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.metrics.GodskrivProcessingMetrikker
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.godskriv.model.GodskrivOpptjeningClient
Expand All @@ -19,6 +20,8 @@ import org.springframework.beans.factory.annotation.Qualifier
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
import java.time.Clock
import java.time.Duration

@Configuration
class GodskrivOpptjeningConfig {
Expand Down Expand Up @@ -63,7 +66,12 @@ class GodskrivOpptjeningConfig {
unleash = unleash,
godskrivProcessingMetricsMåling = godskrivProcessingMetricsMåling,
godskrivProcessingMetricsFeilmåling = godskrivProcessingMetricsFeilmåling,
datasourceReadinessCheck = datasourceReadinessCheck
datasourceReadinessCheck = datasourceReadinessCheck,
timeLock = TimeLock(
initialDelay = Duration.ofSeconds(10),
maxDelay = Duration.ofSeconds(20),
clock = Clock.systemUTC()
)
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.kontrollbehandling

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.NavUnleashConfig
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.UnleashWrapper
import org.slf4j.LoggerFactory
Expand All @@ -9,28 +10,29 @@ class KontrollbehandlingProcessingTask(
private val service: KontrollbehandlingProcessingService,
private val unleash: UnleashWrapper,
private val datasourceReadinessCheck: DatasourceReadinessCheck,
private val timeLock: TimeLock,
) : Runnable {

init {
log.info("Starting new thread to process kontrollbehandlinger")
}

companion object {
private val log = LoggerFactory.getLogger(this::class.java)!!
}


override fun run() {
while (true) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.KONTROLL) && datasourceReadinessCheck.isReady()) {
service.process() ?: run {
Thread.sleep(1000)
null
if (timeLock.isOpen()) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.KONTROLL) && datasourceReadinessCheck.isReady()) {
val result = service.process()
if (result == null) {
//ingenting utført, utsett
Thread.sleep(timeLock.lock())
} else {
timeLock.open()
}
}
} catch (exception: Throwable) {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
}
} catch (exception: Throwable) {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.kontrollbehandling.spring

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.kontrollbehandling.KontrollbehandlingProcessingService
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.kontrollbehandling.KontrollbehandlingProcessingServiceImpl
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.kontrollbehandling.KontrollbehandlingProcessingTask
Expand All @@ -18,6 +19,7 @@ import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
import java.time.Clock
import java.time.Duration

@Configuration
class KontrollConfig {
Expand Down Expand Up @@ -69,7 +71,12 @@ class KontrollConfig {
return KontrollbehandlingProcessingTask(
service = service,
unleash = unleash,
datasourceReadinessCheck = datasourceReadinessCheck
datasourceReadinessCheck = datasourceReadinessCheck,
timeLock = TimeLock(
initialDelay = Duration.ofSeconds(8),
maxDelay = Duration.ofSeconds(20),
clock = Clock.systemUTC()
)
)
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.metrics.OppgaveProcessingMetricsFeilmåling
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.metrics.OppgaveProcessingMetrikker
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unleash.NavUnleashConfig
Expand All @@ -14,27 +15,33 @@ class OppgaveProcessingTask(
private val oppgaveProcessingMetricsMåling: OppgaveProcessingMetrikker,
private val oppgaveProcessingMetricsFeilmåling: OppgaveProcessingMetricsFeilmåling,
private val datasourceReadinessCheck: DatasourceReadinessCheck,
private val timeLock: TimeLock,
) : Runnable {

companion object {
private val log = LoggerFactory.getLogger(this::class.java)!!
}

init {
log.info("Starting new thread to process oppgaver")
}

override fun run() {
while (true) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.OPPRETT_OPPGAVER) && datasourceReadinessCheck.isReady()) {
oppgaveProcessingMetricsMåling.oppdater {
service.process()
if (timeLock.isOpen()) {
try {
if (unleash.isEnabled(NavUnleashConfig.Feature.OPPRETT_OPPGAVER) && datasourceReadinessCheck.isReady()) {
oppgaveProcessingMetricsMåling.oppdater {
val result = service.process()
if (result == null) {
//ingenting utført, utsett
Thread.sleep(timeLock.lock())
} else {
timeLock.open()
}
result
}
}
} catch (exception: Throwable) {
oppgaveProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
}
}
} catch (exception: Throwable) {
oppgaveProcessingMetricsFeilmåling.oppdater {
log.warn("Exception caught while processing ${exception::class.qualifiedName}")
}
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.spring

import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.DatasourceReadinessCheck
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.config.TimeLock
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.metrics.OppgaveProcessingMetricsFeilmåling
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.metrics.OppgaveProcessingMetrikker
import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.oppgave.model.OppgaveProcessingTask
Expand All @@ -9,6 +10,8 @@ import no.nav.pensjon.opptjening.omsorgsopptjening.bestem.pensjonsopptjening.unl
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Profile
import java.time.Clock
import java.time.Duration

@Configuration
class OppgaveConfig {
Expand All @@ -27,7 +30,12 @@ class OppgaveConfig {
unleash = unleash,
oppgaveProcessingMetricsMåling = oppgaveProcessingMetricsMåling,
oppgaveProcessingMetricsFeilmåling = oppgaveProcessingMetricsFeilmåling,
datasourceReadinessCheck = datasourceReadinessCheck
datasourceReadinessCheck = datasourceReadinessCheck,
timeLock = TimeLock(
initialDelay = Duration.ofSeconds(6),
maxDelay = Duration.ofSeconds(20),
clock = Clock.systemUTC()
)
)
}
}
Loading

0 comments on commit babe8ca

Please sign in to comment.