From b35b0e82543d60aba57579c0032fba169a2f76be Mon Sep 17 00:00:00 2001 From: Alok Kumar <59380269+AlokSP@users.noreply.github.com> Date: Tue, 20 May 2025 12:22:29 +0530 Subject: [PATCH] Retryable and logback --- pom.xml | 8 ++++++ .../elasticsearch/config/RetryConfig.java | 9 +++++++ .../controllers/HomeController.java | 6 +---- .../elasticsearch/models/QueueManagement.java | 14 +++++----- .../services/DocumentSearchService.java | 26 +++++++++++++++++++ src/main/resources/logback.xml | 15 ++++++++--- 6 files changed, 63 insertions(+), 15 deletions(-) create mode 100644 src/main/java/org/spoken_tutorial/health/elasticsearch/config/RetryConfig.java diff --git a/pom.xml b/pom.xml index 79990d8..9691a37 100644 --- a/pom.xml +++ b/pom.xml @@ -82,6 +82,14 @@ poi-ooxml 5.2.5 + + org.springframework.retry + spring-retry + + + org.springframework + spring-aspects + diff --git a/src/main/java/org/spoken_tutorial/health/elasticsearch/config/RetryConfig.java b/src/main/java/org/spoken_tutorial/health/elasticsearch/config/RetryConfig.java new file mode 100644 index 0000000..7a28362 --- /dev/null +++ b/src/main/java/org/spoken_tutorial/health/elasticsearch/config/RetryConfig.java @@ -0,0 +1,9 @@ +package org.spoken_tutorial.health.elasticsearch.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.retry.annotation.EnableRetry; + +@EnableRetry +@Configuration +public class RetryConfig { +} \ No newline at end of file diff --git a/src/main/java/org/spoken_tutorial/health/elasticsearch/controllers/HomeController.java b/src/main/java/org/spoken_tutorial/health/elasticsearch/controllers/HomeController.java index 51f23f3..62a0e17 100644 --- a/src/main/java/org/spoken_tutorial/health/elasticsearch/controllers/HomeController.java +++ b/src/main/java/org/spoken_tutorial/health/elasticsearch/controllers/HomeController.java @@ -17,7 +17,6 @@ import org.spoken_tutorial.health.elasticsearch.config.Config; import org.spoken_tutorial.health.elasticsearch.models.DocumentSearch; import org.spoken_tutorial.health.elasticsearch.models.QueueManagement; -import org.spoken_tutorial.health.elasticsearch.repositories.DocumentSearchRepository; import org.spoken_tutorial.health.elasticsearch.repositories.QueueManagementRepository; import org.spoken_tutorial.health.elasticsearch.services.DocumentSearchService; import org.spoken_tutorial.health.elasticsearch.services.QueueManagementService; @@ -39,9 +38,6 @@ public class HomeController { private static final Logger logger = LoggerFactory.getLogger(HomeController.class); - @Autowired - private DocumentSearchRepository docuSearchRepo; - @Autowired private QueueManagementRepository queRepo; @@ -132,7 +128,7 @@ else if (status.equals(Config.STATUS_FAILED)) { public Map documentStatus(@PathVariable String documentId) { Map resultMap = new HashMap<>(); - DocumentSearch documentSearch = docuSearchRepo.findByDocumentId(documentId); + DocumentSearch documentSearch = docuSearchService.findByDocumentId(documentId); if (documentSearch == null) { resultMap.put(Config.STATUS, Config.STATUS_NOTFOUND); diff --git a/src/main/java/org/spoken_tutorial/health/elasticsearch/models/QueueManagement.java b/src/main/java/org/spoken_tutorial/health/elasticsearch/models/QueueManagement.java index 5fafed9..a4be266 100644 --- a/src/main/java/org/spoken_tutorial/health/elasticsearch/models/QueueManagement.java +++ b/src/main/java/org/spoken_tutorial/health/elasticsearch/models/QueueManagement.java @@ -10,8 +10,8 @@ import org.spoken_tutorial.health.elasticsearch.JsonService.JsonService; import org.spoken_tutorial.health.elasticsearch.config.Config; import org.spoken_tutorial.health.elasticsearch.contentfile.ContentsfromFile; -import org.spoken_tutorial.health.elasticsearch.repositories.DocumentSearchRepository; import org.spoken_tutorial.health.elasticsearch.repositories.QueueManagementRepository; +import org.spoken_tutorial.health.elasticsearch.services.DocumentSearchService; import org.spoken_tutorial.health.elasticsearch.threadpool.TaskProcessingService; import org.springframework.beans.factory.annotation.Autowired; @@ -29,7 +29,7 @@ public class QueueManagement implements Runnable { @Autowired @Transient - private DocumentSearchRepository docRepo; + private DocumentSearchService docSearchService; @Autowired @Transient @@ -413,7 +413,7 @@ public void run() { logger.info("{}", getStatusLog()); setStartTime(System.currentTimeMillis()); - documentSearch = docRepo.findByDocumentId(getDocumentId()); + documentSearch = docSearchService.findByDocumentId(getDocumentId()); if (getRequestType().equals(Config.ADD_DOCUMENT)) { if (documentSearch != null) { @@ -480,7 +480,7 @@ public void run() { documentSearch.setRank(getRank()); documentSearch.setViewUrl(getViewUrl()); - docRepo.save(documentSearch); + docSearchService.save(documentSearch); setStatus(Config.STATUS_DONE); logger.info("{}", getStatusLog()); @@ -578,7 +578,7 @@ else if (getLanguageId() != documentSearch.getLanguageId()) { if (getOrderValue() != 0) documentSearch.setOrderValue(getOrderValue()); - docRepo.save(documentSearch); + docSearchService.save(documentSearch); setStatus(Config.STATUS_DONE); logger.info("{}", getStatusLog()); @@ -591,14 +591,14 @@ else if (getRequestType().equals(Config.UPDATE_DOCUMENT_RANK)) { documentSearch.setChangeTime(System.currentTimeMillis()); } - docRepo.save(documentSearch); + docSearchService.save(documentSearch); setStatus(Config.STATUS_DONE); logger.info("{}", getStatusLog()); } else if (getRequestType().equals(Config.DELETE_DOCUMENT)) { - docRepo.delete(documentSearch); + docSearchService.delete(documentSearch); setStatus(Config.STATUS_DONE); logger.info("{}", getStatusLog()); diff --git a/src/main/java/org/spoken_tutorial/health/elasticsearch/services/DocumentSearchService.java b/src/main/java/org/spoken_tutorial/health/elasticsearch/services/DocumentSearchService.java index b030d18..1a52616 100644 --- a/src/main/java/org/spoken_tutorial/health/elasticsearch/services/DocumentSearchService.java +++ b/src/main/java/org/spoken_tutorial/health/elasticsearch/services/DocumentSearchService.java @@ -1,5 +1,7 @@ package org.spoken_tutorial.health.elasticsearch.services; +import java.io.IOException; + import org.apache.tika.parser.AutoDetectParser; import org.apache.tika.parser.Parser; import org.slf4j.Logger; @@ -10,6 +12,9 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Recover; +import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.PathVariable; @@ -45,4 +50,25 @@ public ResponseEntity addContent(@PathVariable String path, @Pat return new ResponseEntity<>(tut, HttpStatus.OK); } + + public DocumentSearch findByDocumentId(String documentId) { + return repo.findByDocumentId(documentId); + } + + public void delete(DocumentSearch documentSearch) { + repo.delete(documentSearch); + } + + @Retryable(retryFor = { IOException.class, + RuntimeException.class }, maxAttempts = 5, backoff = @Backoff(delay = 5000)) + public void save(DocumentSearch documentSearch) { + repo.save(documentSearch); + } + + @Recover + public void recover(Exception e, DocumentSearch documentSearch) { + // Handle failure after retries + logger.error("Failed to save document after retries", e); + } + } diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 9ebf042..413d830 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -19,10 +19,19 @@ %d %p %c{1} [%t] %X{queueId} %m%n + + + + + + + - - - + + + + +