From 7b8e0f61a2be55a79bec457e65674eb1097c3008 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Fri, 6 Nov 2026 13:27:16 +0100 Subject: feat: replace old Spring Retry --- build.gradle.kts | 2 - .../etl/processor/config/AppConfigurationTest.kt | 7 ++-- .../processor/output/RestDipMtbFileSenderTest.kt | 10 +++-- .../pseudonym/GpasPseudonymGeneratorTest.kt | 12 ++++-- .../etl/processor/consent/GicsConsentService.java | 23 +++++++---- .../consent/GicsGetBroadConsentService.java | 18 ++++---- .../pseudonym/GpasPseudonymGenerator.java | 6 +-- .../dnpm/etl/processor/config/AppConfiguration.kt | 48 ++++++++++++---------- .../etl/processor/config/AppKafkaConfiguration.kt | 2 +- .../etl/processor/config/AppRestConfiguration.kt | 2 +- .../processor/config/AppRoutedRestConfiguration.kt | 2 +- .../etl/processor/output/KafkaMtbFileSender.kt | 6 +-- .../etl/processor/output/RestDipMtbFileSender.kt | 10 +---- .../dnpm/etl/processor/output/RestMtbFileSender.kt | 6 +-- .../etl/processor/output/RestNngmMtbFileSender.kt | 2 +- .../output/RoutedRestNngmMtbFileSender.kt | 4 +- .../pseudonym/GpasSoapPseudonymGenerator.kt | 6 +-- .../processor/pseudonym/VfpsPseudonymGenerator.kt | 4 +- .../processor/consent/GicsConsentServiceTest.java | 12 +++--- .../consent/GicsGetBroadConsentServiceTest.java | 10 ++--- .../etl/processor/output/KafkaMtbFileSenderTest.kt | 28 ++++++++++--- .../processor/output/RestDipMtbFileSenderTest.kt | 18 +++++--- 22 files changed, 135 insertions(+), 103 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 9a08216..8e5dca0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -25,7 +25,6 @@ val mtbModelVersion = "0.6.0" val hapiFhirVersion = "8.10.2" val apacheCxfVersion = "4.2.4" val springModulithVersion = "2.1.2" -val springRetryVersion = "2.0.13" // Additional test versions val mockitoKotlinVersion = "6.4.0" @@ -75,7 +74,6 @@ dependencies { implementation("com.fasterxml.jackson.datatype:jackson-datatype-jdk8") implementation("tools.jackson.module:jackson-module-kotlin") implementation("org.springframework.kafka:spring-kafka") - implementation("org.springframework.retry:spring-retry:$springRetryVersion") implementation("org.flywaydb:flyway-database-postgresql") implementation("org.flywaydb:flyway-mysql") implementation("commons-codec:commons-codec") diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt index e1e9f0d..2278c3d 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/config/AppConfigurationTest.kt @@ -48,7 +48,7 @@ import org.springframework.beans.factory.getBean import org.springframework.boot.kafka.autoconfigure.KafkaAutoConfiguration import org.springframework.boot.test.context.SpringBootTest import org.springframework.context.ApplicationContext -import org.springframework.retry.support.RetryTemplate +import org.springframework.core.retry.RetryTemplate import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.provisioning.InMemoryUserDetailsManager import org.springframework.test.context.ContextConfiguration @@ -331,9 +331,10 @@ class AppConfigurationTest { val retryTemplate = context.getBean() assertThat(retryTemplate).isNotNull + var retries = 0 assertThrows { - retryTemplate.execute { - assertThat(it.retryCount).isLessThan(maxRetryAttempts) + retryTemplate.execute { + assertThat(retries++).isLessThan(maxRetryAttempts) throw RuntimeException() } } diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt index bbad55a..9094478 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt @@ -39,11 +39,11 @@ import org.junit.jupiter.api.Nested import org.junit.jupiter.api.Test import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest +import org.springframework.core.retry.RetryPolicy +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus import org.springframework.http.MediaType -import org.springframework.retry.policy.SimpleRetryPolicy -import org.springframework.retry.support.RetryTemplateBuilder import org.springframework.test.context.ContextConfiguration import org.springframework.test.context.TestPropertySource import org.springframework.test.context.bean.override.mockito.MockitoBean @@ -89,7 +89,11 @@ class RestDipMtbFileSenderTest { ) { val restTemplate = restTemplate val restTargetProperties = RestTargetProperties("http://localhost:9000/api", null, null) - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(0) + .build() + ) this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate) diff --git a/src/integrationTest/kotlin/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGeneratorTest.kt b/src/integrationTest/kotlin/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGeneratorTest.kt index 78089d6..c91e8a9 100644 --- a/src/integrationTest/kotlin/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGeneratorTest.kt +++ b/src/integrationTest/kotlin/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGeneratorTest.kt @@ -27,11 +27,11 @@ import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertThrows +import org.springframework.core.retry.RetryPolicy +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus -import org.springframework.retry.policy.SimpleRetryPolicy -import org.springframework.retry.support.RetryTemplateBuilder import org.springframework.test.web.client.MockRestServiceServer import org.springframework.test.web.client.match.MockRestRequestMatchers.method import org.springframework.test.web.client.match.MockRestRequestMatchers.requestTo @@ -49,7 +49,13 @@ class GpasPseudonymGeneratorTest { @BeforeEach fun setup() { - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = + RetryTemplate( + RetryPolicy + .builder() + .maxRetries(0) + .build(), + ) val gPasConfigProperties = GPasConfigProperties(CONFIGURED_URI, null, null, "test", "test2", null, null) diff --git a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java index 0a00d1f..b232df1 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/GicsConsentService.java @@ -35,12 +35,12 @@ import org.hl7.fhir.r4.model.Parameters.ParametersParameterComponent; import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.slf4j.LoggerFactory; +import org.springframework.core.retry.RetryException; +import org.springframework.core.retry.RetryTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; -import org.springframework.retry.TerminatedRetryException; -import org.springframework.retry.support.RetryTemplate; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -169,7 +169,7 @@ public class GicsConsentService extends AbstractConsentService { new HttpEntity<>(parameterAsXml, this.headersWithHttpBasicAuth()); try { var responseEntity = - retryTemplate.execute(ctx -> + retryTemplate.execute(() -> restTemplate.exchange( endpointUri(endpoint), HttpMethod.POST, requestEntity, String.class)); @@ -188,15 +188,20 @@ public class GicsConsentService extends AbstractConsentService { log.error(msg); return null; - } catch (TerminatedRetryException terminatedRetryException) { + } catch (RetryException retryException) { + if (retryException.getCause() instanceof URISyntaxException) { + var msg = + String.format( + "Invalid URI for consents status request: '%s'", + retryException.getCause().getMessage()); + log.error(msg); + return null; + } + var msg = String.format( "Get consents status process has been terminated. termination reason: '%s", - terminatedRetryException.getMessage()); - log.error(msg); - return null; - } catch (URISyntaxException e) { - var msg = String.format("Invalid URI for consents status request: '%s'", e.getMessage()); + retryException.getMessage()); log.error(msg); return null; } diff --git a/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java b/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java index eb99ebf..9ba0591 100644 --- a/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java +++ b/src/main/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentService.java @@ -29,11 +29,11 @@ import org.hl7.fhir.r4.model.Bundle; import org.jspecify.annotations.NullMarked; import org.jspecify.annotations.Nullable; import org.slf4j.LoggerFactory; +import org.springframework.core.retry.RetryException; +import org.springframework.core.retry.RetryTemplate; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; -import org.springframework.retry.TerminatedRetryException; -import org.springframework.retry.support.RetryTemplate; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -129,7 +129,7 @@ public class GicsGetBroadConsentService extends AbstractConsentService { } final var response = - this.retryTemplate.execute(retryContext -> + this.retryTemplate.execute(() -> this.restTemplate.exchange( uri, HttpMethod.GET, new HttpEntity<>(requestHeaders), String.class)); if (response.getStatusCode().is2xxSuccessful()) { @@ -142,20 +142,20 @@ public class GicsGetBroadConsentService extends AbstractConsentService { log.error(msg); return null; } + } catch (URISyntaxException e) { + var msg = String.format("Invalid URI for consents status request: '%s'", e.getMessage()); + log.error(msg); + return null; } catch (RestClientException e) { var msg = String.format("Get consents status request failed reason: '%s", e.getMessage()); log.error(msg); return null; - } catch (TerminatedRetryException terminatedRetryException) { + } catch (RetryException retryException) { var msg = String.format( "Get consents status process has been terminated. termination reason: '%s", - terminatedRetryException.getMessage()); - log.error(msg); - return null; - } catch (URISyntaxException e) { - var msg = String.format("Invalid URI for consents status request: '%s'", e.getMessage()); + retryException.getMessage()); log.error(msg); return null; } diff --git a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java index 2e8adf7..79db2c3 100644 --- a/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java +++ b/src/main/java/dev/dnpm/etl/processor/pseudonym/GpasPseudonymGenerator.java @@ -37,8 +37,8 @@ import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.core.retry.RetryTemplate; import org.springframework.http.*; -import org.springframework.retry.support.RetryTemplate; import org.springframework.web.client.HttpClientErrorException.BadRequest; import org.springframework.web.client.HttpClientErrorException.Unauthorized; import org.springframework.web.client.RestTemplate; @@ -152,8 +152,8 @@ public class GpasPseudonymGenerator implements Generator { try { var targetUrl = buildRequestUrl(apiEndpoint); ResponseEntity responseEntity = - retryTemplate.execute(ctx -> - restTemplate.exchange(targetUrl, HttpMethod.POST, requestEntity, String.class)); + retryTemplate.execute( + () -> restTemplate.exchange(targetUrl, HttpMethod.POST, requestEntity, String.class)); if (responseEntity.getStatusCode().is2xxSuccessful()) { log.debug("API request succeeded. Response: {}", responseEntity.getStatusCode()); return responseEntity; diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt index 44fd719..dba0f3c 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppConfiguration.kt @@ -42,15 +42,10 @@ import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Conditional import org.springframework.context.annotation.Configuration import org.springframework.context.annotation.ConfigurationCondition +import org.springframework.core.retry.* import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration import org.springframework.http.converter.StringHttpMessageConverter import org.springframework.http.converter.json.JacksonJsonHttpMessageConverter -import org.springframework.retry.RetryCallback -import org.springframework.retry.RetryContext -import org.springframework.retry.RetryListener -import org.springframework.retry.policy.SimpleRetryPolicy -import org.springframework.retry.support.RetryTemplate -import org.springframework.retry.support.RetryTemplateBuilder import org.springframework.scheduling.annotation.EnableScheduling import org.springframework.security.crypto.password.PasswordEncoder import org.springframework.security.provisioning.InMemoryUserDetailsManager @@ -189,24 +184,33 @@ class AppConfiguration { @Bean fun retryTemplate(configProperties: AppConfigProperties): RetryTemplate { - return RetryTemplateBuilder() - .notRetryOn(IllegalArgumentException::class.java) - .notRetryOn(HttpClientErrorException.BadRequest::class.java) - .notRetryOn(HttpClientErrorException.UnprocessableContent::class.java) - .exponentialBackoff(2.seconds.toJavaDuration(), 1.25, 5.seconds.toJavaDuration()) - .customPolicy(SimpleRetryPolicy(configProperties.maxRetryAttempts)) - .withListener( - object : RetryListener { - override fun onError( - context: RetryContext, - callback: RetryCallback, - throwable: Throwable, - ) { - logger.warn("Error occured: {}. Retrying {}", throwable.message, context.retryCount) - } - } + val retryPolicy = RetryPolicy.builder() + .excludes( + IllegalArgumentException::class.java, + HttpClientErrorException.BadRequest::class.java, + HttpClientErrorException.UnprocessableContent::class.java ) + .maxRetries(configProperties.maxRetryAttempts.toLong() - 1) + .delay(2.seconds.toJavaDuration()) + .multiplier(1.25) + .maxDelay(5.seconds.toJavaDuration()) .build() + + return RetryTemplate(retryPolicy).apply { + setRetryListener(object : RetryListener { + override fun onRetryableExecution( + retryPolicy: RetryPolicy, + retryable: Retryable<*>, + retryState: RetryState, + ) { + logger.warn( + "Error occured: {}. Retrying {}", + retryState.lastException.message, + retryState.retryCount + ) + } + }) + } } @ConditionalOnProperty(value = ["app.security.enable-tokens"], havingValue = "true") diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt index aa3e6cb..df23857 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppKafkaConfiguration.kt @@ -37,11 +37,11 @@ import org.springframework.context.ApplicationEventPublisher import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.core.annotation.Order +import org.springframework.core.retry.RetryTemplate import org.springframework.kafka.core.ConsumerFactory import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.listener.ContainerProperties import org.springframework.kafka.listener.KafkaMessageListenerContainer -import org.springframework.retry.support.RetryTemplate import reactor.core.publisher.Sinks import tools.jackson.databind.json.JsonMapper diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt index 7965f96..51004ff 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRestConfiguration.kt @@ -34,7 +34,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.core.annotation.Order -import org.springframework.retry.support.RetryTemplate +import org.springframework.core.retry.RetryTemplate import org.springframework.web.client.RestTemplate import reactor.core.publisher.Sinks diff --git a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRoutedRestConfiguration.kt b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRoutedRestConfiguration.kt index f962a6c..13d7eed 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/config/AppRoutedRestConfiguration.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/config/AppRoutedRestConfiguration.kt @@ -29,7 +29,7 @@ import org.springframework.boot.context.properties.EnableConfigurationProperties import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import org.springframework.core.annotation.Order -import org.springframework.retry.support.RetryTemplate +import org.springframework.core.retry.RetryTemplate import org.springframework.web.client.RestTemplate @Configuration diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt index dd988ed..2fb1281 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSender.kt @@ -27,8 +27,8 @@ import dev.pcvolkmer.mv64e.model.MvhMetadata import dev.pcvolkmer.mv64e.model.PatientRecord import org.apache.kafka.clients.producer.ProducerRecord import org.slf4j.LoggerFactory +import org.springframework.core.retry.RetryTemplate import org.springframework.kafka.core.KafkaTemplate -import org.springframework.retry.support.RetryTemplate import tools.jackson.databind.json.JsonMapper class KafkaMtbFileSender( @@ -41,7 +41,7 @@ class KafkaMtbFileSender( override fun send(request: MtbFileRequest): MtbFileSender.Response { return try { - return retryTemplate.execute { + return retryTemplate.execute { val record = ProducerRecord( kafkaProperties.outputTopic, @@ -79,7 +79,7 @@ class KafkaMtbFileSender( val dummyMtbFile = PatientRecord.builder().metadata(MvhMetadata()).build() return try { - return retryTemplate.execute { + return retryTemplate.execute { val record = ProducerRecord( kafkaProperties.outputTopic, diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt index 1bcca5e..676a2e9 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSender.kt @@ -24,18 +24,10 @@ import dev.dnpm.etl.processor.CustomMediaType import dev.dnpm.etl.processor.PatientPseudonym import dev.dnpm.etl.processor.config.RestTargetProperties import dev.dnpm.etl.processor.monitoring.ReportService -import dev.dnpm.etl.processor.monitoring.RequestStatus -import dev.dnpm.etl.processor.monitoring.asRequestStatus -import org.slf4j.LoggerFactory -import org.springframework.http.HttpEntity +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpHeaders -import org.springframework.http.HttpMethod import org.springframework.http.MediaType -import org.springframework.retry.support.RetryTemplate -import org.springframework.web.client.RestClientException -import org.springframework.web.client.RestClientResponseException import org.springframework.web.client.RestTemplate -import org.springframework.web.client.exchange import org.springframework.web.util.UriComponentsBuilder class RestDipMtbFileSender( diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt index c88f606..722eed3 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/RestMtbFileSender.kt @@ -27,11 +27,11 @@ import dev.dnpm.etl.processor.monitoring.ReportService import dev.dnpm.etl.processor.monitoring.RequestStatus import dev.dnpm.etl.processor.monitoring.asRequestStatus import org.slf4j.LoggerFactory +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.MediaType -import org.springframework.retry.support.RetryTemplate import org.springframework.web.client.RestClientException import org.springframework.web.client.RestClientResponseException import org.springframework.web.client.RestTemplate @@ -52,7 +52,7 @@ abstract class RestMtbFileSender( override fun send(request: MtbFileRequest): MtbFileSender.Response { try { - return retryTemplate.execute { + return retryTemplate.execute { val headers = getHttpHeaders(request) val entityReq = HttpEntity(request.content, headers) val response = @@ -85,7 +85,7 @@ abstract class RestMtbFileSender( override fun send(request: DeleteRequest): MtbFileSender.Response { try { - return retryTemplate.execute { + return retryTemplate.execute { val headers = getHttpHeaders(request) val entityReq = HttpEntity(null, headers) restTemplate.delete(deleteUrl(request.patientId), entityReq, String::class.java) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RestNngmMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RestNngmMtbFileSender.kt index 13722d2..dac291f 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/RestNngmMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/RestNngmMtbFileSender.kt @@ -23,9 +23,9 @@ package dev.dnpm.etl.processor.output import dev.dnpm.etl.processor.PatientPseudonym import dev.dnpm.etl.processor.config.RestTargetProperties import dev.dnpm.etl.processor.monitoring.ReportService +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpHeaders import org.springframework.http.MediaType -import org.springframework.retry.support.RetryTemplate import org.springframework.web.client.RestTemplate import org.springframework.web.util.UriComponentsBuilder diff --git a/src/main/kotlin/dev/dnpm/etl/processor/output/RoutedRestNngmMtbFileSender.kt b/src/main/kotlin/dev/dnpm/etl/processor/output/RoutedRestNngmMtbFileSender.kt index 957645e..8c3f3bd 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/output/RoutedRestNngmMtbFileSender.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/output/RoutedRestNngmMtbFileSender.kt @@ -27,11 +27,11 @@ import dev.dnpm.etl.processor.monitoring.asRequestStatus import dev.pcvolkmer.mv64e.model.MtbDiagnosis import dev.pcvolkmer.mv64e.model.PatientRecord import org.slf4j.LoggerFactory +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.MediaType -import org.springframework.retry.support.RetryTemplate import org.springframework.web.client.RestClientResponseException import org.springframework.web.client.RestTemplate import org.springframework.web.client.exchange @@ -67,7 +67,7 @@ class RoutedRestNngmMtbFileSender( override fun send(request: MtbFileRequest): MtbFileSender.Response { try { - return retryTemplate.execute { + return retryTemplate.execute { val entityReq = HttpEntity(request.content, getHttpHeaders()) val response = restTemplate.exchange(sendUrl(), HttpMethod.POST, entityReq) diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt index 589a2d4..d166065 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/GpasSoapPseudonymGenerator.kt @@ -22,7 +22,7 @@ package dev.dnpm.etl.processor.pseudonym import dev.dnpm.etl.processor.config.AppFhirConfig import dev.dnpm.etl.processor.config.GPasConfigProperties -import org.springframework.retry.support.RetryTemplate +import org.springframework.core.retry.RetryTemplate class GpasSoapPseudonymGenerator( private val gpasCfg: GPasConfigProperties, @@ -31,12 +31,12 @@ class GpasSoapPseudonymGenerator( private val appFhirConfig: AppFhirConfig, ) : Generator { override fun generate(id: String): String = - retryTemplate.execute { + retryTemplate.execute { gpasSoapService.getOrCreatePseudonymFor(id, gpasCfg.patientDomain) } override fun generateGenomDeTan(id: String): String = - retryTemplate.execute { + retryTemplate.execute { gpasSoapService.createPseudonymsFor(id, gpasCfg.genomDeTanDomain, 1).first() } } diff --git a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/VfpsPseudonymGenerator.kt b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/VfpsPseudonymGenerator.kt index 0a616b5..dcfef86 100644 --- a/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/VfpsPseudonymGenerator.kt +++ b/src/main/kotlin/dev/dnpm/etl/processor/pseudonym/VfpsPseudonymGenerator.kt @@ -1,10 +1,10 @@ package dev.dnpm.etl.processor.pseudonym import dev.dnpm.etl.processor.config.VfpsConfigProperties +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpEntity import org.springframework.http.HttpHeaders import org.springframework.http.MediaType -import org.springframework.retry.support.RetryTemplate import org.springframework.web.client.RestClientException import org.springframework.web.client.RestTemplate import org.springframework.web.client.postForObject @@ -29,7 +29,7 @@ class VfpsPseudonymGenerator( override fun generate(id: String): String = execute { - retryTemplate.execute { + retryTemplate.execute { request(configProperties.patientNamespace, "pseudonyms", id) } } diff --git a/src/test/java/dev/dnpm/etl/processor/consent/GicsConsentServiceTest.java b/src/test/java/dev/dnpm/etl/processor/consent/GicsConsentServiceTest.java index 90c0734..7e392da 100644 --- a/src/test/java/dev/dnpm/etl/processor/consent/GicsConsentServiceTest.java +++ b/src/test/java/dev/dnpm/etl/processor/consent/GicsConsentServiceTest.java @@ -51,8 +51,9 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; +import org.springframework.core.retry.RetryPolicy; +import org.springframework.core.retry.RetryTemplate; import org.springframework.http.MediaType; -import org.springframework.retry.support.RetryTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.client.MockRestServiceServer; @@ -88,13 +89,12 @@ class GicsConsentServiceTest { var restTemplate = new RestTemplate(); + var retryTemplate = new RetryTemplate(RetryPolicy.builder().maxRetries(0).build()); + this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate); this.gicsConsentService = new GicsConsentService( - this.gIcsConfigProperties, - RetryTemplate.builder().maxAttempts(1).build(), - restTemplate, - this.appFhirConfig); + this.gIcsConfigProperties, retryTemplate, restTemplate, this.appFhirConfig); } @Test @@ -277,7 +277,7 @@ class GicsConsentServiceTest { () -> new GicsConsentService( testConfigProperties, - RetryTemplate.builder().maxAttempts(1).build(), + new RetryTemplate(RetryPolicy.builder().maxRetries(0).build()), new RestTemplate(), new AppFhirConfig())); diff --git a/src/test/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentServiceTest.java b/src/test/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentServiceTest.java index e97a8d4..01d05b8 100644 --- a/src/test/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentServiceTest.java +++ b/src/test/java/dev/dnpm/etl/processor/consent/GicsGetBroadConsentServiceTest.java @@ -42,8 +42,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.restclient.test.autoconfigure.RestClientTest; +import org.springframework.core.retry.RetryPolicy; +import org.springframework.core.retry.RetryTemplate; import org.springframework.http.MediaType; -import org.springframework.retry.support.RetryTemplate; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.TestPropertySource; import org.springframework.test.web.client.MockRestServiceServer; @@ -87,13 +88,12 @@ class GicsGetBroadConsentServiceTest { var restTemplate = new RestTemplate(); + var retryTemplyte = new RetryTemplate(RetryPolicy.builder().maxRetries(0).build()); + this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate); this.service = new GicsGetBroadConsentService( - this.gIcsConfigProperties, - RetryTemplate.builder().maxAttempts(1).build(), - restTemplate, - this.appFhirConfig); + this.gIcsConfigProperties, retryTemplyte, restTemplate, this.appFhirConfig); } @Test diff --git a/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt index 9384aae..b2a9bcd 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/output/KafkaMtbFileSenderTest.kt @@ -43,10 +43,10 @@ import org.junit.jupiter.params.provider.MethodSource import org.mockito.Mock import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.* +import org.springframework.core.retry.RetryPolicy +import org.springframework.core.retry.RetryTemplate import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.support.SendResult -import org.springframework.retry.policy.SimpleRetryPolicy -import org.springframework.retry.support.RetryTemplateBuilder import tools.jackson.databind.json.JsonMapper import java.time.Instant import java.util.* @@ -68,7 +68,11 @@ class KafkaMtbFileSenderTest { @BeforeEach fun setup(@Mock kafkaTemplate: KafkaTemplate) { val kafkaProperties = KafkaProperties("testtopic") - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(0) + .build() + ) this.jsonMapper = JsonMapper.builder().build() this.kafkaTemplate = kafkaTemplate @@ -97,7 +101,11 @@ class KafkaMtbFileSenderTest { @MethodSource("dev.dnpm.etl.processor.output.KafkaMtbFileSenderTest#requestWithResponseSource") fun shouldRetryOnDeleteKafkaSendError(testData: TestData) { val kafkaProperties = KafkaProperties("testtopic") - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(3)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(2) + .build() + ) this.kafkaMtbFileSender = KafkaMtbFileSender(this.kafkaTemplate, kafkaProperties, retryTemplate, this.jsonMapper) @@ -136,7 +144,11 @@ class KafkaMtbFileSenderTest { @BeforeEach fun setup(@Mock kafkaTemplate: KafkaTemplate) { val kafkaProperties = KafkaProperties("testtopic") - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(0) + .build() + ) this.jsonMapper = JsonMapper() this.kafkaTemplate = kafkaTemplate @@ -215,7 +227,11 @@ class KafkaMtbFileSenderTest { @MethodSource("dev.dnpm.etl.processor.output.KafkaMtbFileSenderTest#requestWithResponseSource") fun shouldRetryOnMtbFileKafkaSendError(testData: TestData) { val kafkaProperties = KafkaProperties("testtopic") - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(3)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(2) + .build() + ) this.kafkaMtbFileSender = KafkaMtbFileSender(this.kafkaTemplate, kafkaProperties, retryTemplate, this.jsonMapper) diff --git a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt index a13c001..0899c63 100644 --- a/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt +++ b/src/test/kotlin/dev/dnpm/etl/processor/output/RestDipMtbFileSenderTest.kt @@ -39,12 +39,11 @@ import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Nested import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.MethodSource +import org.springframework.core.retry.RetryPolicy +import org.springframework.core.retry.RetryTemplate import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus -import org.springframework.retry.backoff.NoBackOffPolicy -import org.springframework.retry.policy.SimpleRetryPolicy -import org.springframework.retry.support.RetryTemplateBuilder import org.springframework.test.web.client.ExpectedCount import org.springframework.test.web.client.MockRestServiceServer import org.springframework.test.web.client.match.MockRestRequestMatchers.* @@ -70,7 +69,11 @@ class RestDipMtbFileSenderTest { fun setup() { val restTemplate = RestTemplate() val restTargetProperties = RestTargetProperties("http://localhost:9000/api", null, null) - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(0) + .build() + ) this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate) @@ -118,7 +121,11 @@ class RestDipMtbFileSenderTest { fun setup() { val restTemplate = RestTemplate() val restTargetProperties = RestTargetProperties("http://localhost:9000/api", null, null) - val retryTemplate = RetryTemplateBuilder().customPolicy(SimpleRetryPolicy(1)).build() + val retryTemplate = RetryTemplate( + RetryPolicy.builder() + .maxRetries(0) + .build() + ) this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate) @@ -155,7 +162,6 @@ class RestDipMtbFileSenderTest { val restTemplate = RestTemplate() val restTargetProperties = RestTargetProperties("http://localhost:9000/api", null, null) val retryTemplate = AppConfiguration().retryTemplate(AppConfigProperties()) - retryTemplate.setBackOffPolicy(NoBackOffPolicy()) this.mockRestServiceServer = MockRestServiceServer.createServer(restTemplate) this.restMtbFileSender = -- cgit v1.2.3