diff --git a/ocr-service-v1/ocr-service-processor/build.gradle.kts b/ocr-service-v1/ocr-service-processor/build.gradle.kts index 9b20264..b855a36 100644 --- a/ocr-service-v1/ocr-service-processor/build.gradle.kts +++ b/ocr-service-v1/ocr-service-processor/build.gradle.kts @@ -14,7 +14,7 @@ dependencies { api("net.sourceforge.tess4j:tess4j:5.8.0") api("com.iqser.red.commons:metric-commons:2.1.0") api("com.iqser.red.commons:storage-commons:2.45.0") - api("com.knecon.fforesight:tenant-commons:0.21.0") + api("com.knecon.fforesight:tenant-commons:RED-9331") api("com.pdftron:PDFNet:10.5.0") api("org.apache.pdfbox:pdfbox:3.0.0") api("org.apache.pdfbox:jbig2-imageio:3.0.4") diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/Application.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/Application.java index 9998824..aa0bf21 100644 --- a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/Application.java +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/Application.java @@ -12,7 +12,7 @@ import org.springframework.scheduling.annotation.EnableAsync; import com.iqser.red.pdftronlogic.commons.InvisibleElementRemovalService; import com.iqser.red.pdftronlogic.commons.WatermarkRemovalService; import com.knecon.fforesight.service.ocr.processor.OcrServiceProcessorConfiguration; -import com.knecon.fforesight.service.ocr.v1.server.queue.MessagingConfiguration; +import com.knecon.fforesight.service.ocr.v1.server.configuration.MessagingConfiguration; import com.iqser.red.storage.commons.StorageAutoConfiguration; import com.knecon.fforesight.tenantcommons.MultiTenancyAutoConfiguration; import com.knecon.fforesight.tracing.OpenTelemetryConfig; diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/MessagingConfiguration.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/MessagingConfiguration.java new file mode 100644 index 0000000..2461c6e --- /dev/null +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/MessagingConfiguration.java @@ -0,0 +1,23 @@ +package com.knecon.fforesight.service.ocr.v1.server.configuration; + +import org.springframework.amqp.core.Queue; +import org.springframework.amqp.core.QueueBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import lombok.RequiredArgsConstructor; + +@Configuration +@RequiredArgsConstructor +public class MessagingConfiguration { + + public static final String OCR_REQUEST_QUEUE_PREFIX = "ocr_request_queue"; + public static final String OCR_REQUEST_EXCHANGE = "ocr_request_exchange"; + public static final String OCR_DLQ = "ocr_dlq"; + public static final String OCR_RESPONSE_EXCHANGE = "ocr_response_exchange"; + public static final String OCR_STATUS_UPDATE_EXCHANGE = "ocr_status_update_exchange"; + public static final String OCR_STATUS_UPDATE_DLQ = "ocr_status_update_dlq"; + + public static final String X_ERROR_INFO_HEADER = "x-error-message"; + public static final String X_ERROR_INFO_TIMESTAMP_HEADER = "x-error-message-timestamp"; +} diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/TenantMessagingConfigurationImpl.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/TenantMessagingConfigurationImpl.java new file mode 100644 index 0000000..f49629c --- /dev/null +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/configuration/TenantMessagingConfigurationImpl.java @@ -0,0 +1,35 @@ +package com.knecon.fforesight.service.ocr.v1.server.configuration; + +import org.springframework.context.annotation.Configuration; + +import com.knecon.fforesight.tenantcommons.queue.TenantMessagingConfiguration; + +@Configuration +public class TenantMessagingConfigurationImpl extends TenantMessagingConfiguration { + + public static final String TENANT_CREATED_EVENT_QUEUE = "ocr-tenant-created-queue"; + public static final String TENANT_DELETED_EVENT_QUEUE = "ocr-tenant-deleted-queue"; + public static final String TENANT_EVENTS_DLQ = "ocr-tenant-events-dlq"; + + + @Override + protected String getTenantCreatedQueueName() { + + return TENANT_CREATED_EVENT_QUEUE; + } + + + @Override + protected String getTenantDeletedQueueName() { + + return TENANT_DELETED_EVENT_QUEUE; + } + + + @Override + protected String getTenantEventsDLQName() { + + return TENANT_EVENTS_DLQ; + } + +} diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/MessagingConfiguration.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/MessagingConfiguration.java deleted file mode 100644 index d51f81b..0000000 --- a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/MessagingConfiguration.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.knecon.fforesight.service.ocr.v1.server.queue; - -import org.springframework.amqp.core.Queue; -import org.springframework.amqp.core.QueueBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import lombok.RequiredArgsConstructor; - -@Configuration -@RequiredArgsConstructor -public class MessagingConfiguration { - - public static final String OCR_REQUEST_QUEUE = "ocr_request_queue"; - public static final String OCR_RESPONSE_QUEUE = "ocr_response_queue"; - public static final String OCR_STATUS_UPDATE_RESPONSE_QUEUE = "ocr_status_update_response_queue"; - public static final String X_ERROR_INFO_HEADER = "x-error-message"; - public static final String X_ERROR_INFO_TIMESTAMP_HEADER = "x-error-message-timestamp"; - -} diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/NoStatusUpdateOcrMessageSender.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/NoStatusUpdateOcrMessageSender.java index 911bedd..33d967a 100644 --- a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/NoStatusUpdateOcrMessageSender.java +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/NoStatusUpdateOcrMessageSender.java @@ -6,6 +6,9 @@ import org.springframework.stereotype.Service; import com.knecon.fforesight.service.ocr.processor.service.IOcrMessageSender; import com.knecon.fforesight.service.ocr.v1.api.model.DocumentRequest; +import com.knecon.fforesight.service.ocr.v1.server.configuration.MessagingConfiguration; +import com.knecon.fforesight.tenantcommons.TenantContext; + import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; @@ -36,7 +39,7 @@ public class NoStatusUpdateOcrMessageSender implements IOcrMessageSender { public void sendOcrResponse(String dossierId, String fileId) { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_RESPONSE_QUEUE, new DocumentRequest(dossierId, fileId)); + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_RESPONSE_EXCHANGE, TenantContext.getTenantId(), new DocumentRequest(dossierId, fileId)); } } diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageReceiver.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageReceiver.java index 825f7b0..9b19578 100644 --- a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageReceiver.java +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageReceiver.java @@ -19,6 +19,8 @@ import com.knecon.fforesight.service.ocr.processor.service.IOcrMessageSender; import com.knecon.fforesight.service.ocr.processor.service.OCRService; import com.knecon.fforesight.service.ocr.processor.service.OsUtils; import com.knecon.fforesight.service.ocr.v1.api.model.DocumentRequest; +import com.knecon.fforesight.service.ocr.v1.server.configuration.MessagingConfiguration; + import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; @@ -30,6 +32,8 @@ import lombok.extern.slf4j.Slf4j; @FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE) public class OcrMessageReceiver { + public static final String OCR_REQUEST_LISTENER_ID = "ocr-request-listener"; + FileStorageService fileStorageService; ObjectMapper objectMapper; OCRService ocrService; @@ -37,7 +41,7 @@ public class OcrMessageReceiver { @RabbitHandler - @RabbitListener(queues = MessagingConfiguration.OCR_REQUEST_QUEUE, concurrency = "1") + @RabbitListener(id = OCR_REQUEST_LISTENER_ID, concurrency = "1") public void receiveOcr(Message in) throws IOException { if (in.getMessageProperties().isRedelivered()) { diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageSender.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageSender.java index 97bef9d..81e76bd 100644 --- a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageSender.java +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/OcrMessageSender.java @@ -7,8 +7,9 @@ import org.springframework.stereotype.Service; import com.knecon.fforesight.service.ocr.processor.service.IOcrMessageSender; import com.knecon.fforesight.service.ocr.v1.api.model.DocumentRequest; import com.knecon.fforesight.service.ocr.v1.api.model.OCRStatusUpdateResponse; +import com.knecon.fforesight.service.ocr.v1.server.configuration.MessagingConfiguration; +import com.knecon.fforesight.tenantcommons.TenantContext; -import jakarta.annotation.PostConstruct; import lombok.AccessLevel; import lombok.RequiredArgsConstructor; import lombok.experimental.FieldDefaults; @@ -26,30 +27,33 @@ public class OcrMessageSender implements IOcrMessageSender { public void sendOcrFinished(String fileId, int totalImages) { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, - OCRStatusUpdateResponse.builder().fileId(fileId).numberOfPagesToOCR(totalImages).numberOfOCRedPages(totalImages).ocrFinished(true).build()); + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_EXCHANGE, + TenantContext.getTenantId(), + OCRStatusUpdateResponse.builder().fileId(fileId).numberOfPagesToOCR(totalImages).numberOfOCRedPages(totalImages).ocrFinished(true).build()); } public void sendOCRStarted(String fileId) { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, - OCRStatusUpdateResponse.builder().fileId(fileId).ocrStarted(true).build()); + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_EXCHANGE, + TenantContext.getTenantId(), + OCRStatusUpdateResponse.builder().fileId(fileId).ocrStarted(true).build()); } public void sendUpdate(String fileId, int finishedImages, int totalImages) { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_RESPONSE_QUEUE, - OCRStatusUpdateResponse.builder().fileId(fileId).numberOfPagesToOCR(totalImages).numberOfOCRedPages(finishedImages).build()); + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_STATUS_UPDATE_EXCHANGE, + TenantContext.getTenantId(), + OCRStatusUpdateResponse.builder().fileId(fileId).numberOfPagesToOCR(totalImages).numberOfOCRedPages(finishedImages).build()); } public void sendOcrResponse(String dossierId, String fileId) { - rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_RESPONSE_QUEUE, new DocumentRequest(dossierId, fileId)); + rabbitTemplate.convertAndSend(MessagingConfiguration.OCR_RESPONSE_EXCHANGE, TenantContext.getTenantId(), new DocumentRequest(dossierId, fileId)); } } diff --git a/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/TenantExchangeMessageReceiverImpl.java b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/TenantExchangeMessageReceiverImpl.java new file mode 100644 index 0000000..84a2784 --- /dev/null +++ b/ocr-service-v1/ocr-service-server/src/main/java/com/knecon/fforesight/service/ocr/v1/server/queue/TenantExchangeMessageReceiverImpl.java @@ -0,0 +1,69 @@ +package com.knecon.fforesight.service.ocr.v1.server.queue; + + +import static com.knecon.fforesight.service.ocr.v1.server.configuration.MessagingConfiguration.*; +import static com.knecon.fforesight.service.ocr.v1.server.configuration.TenantMessagingConfigurationImpl.*; + +import java.util.Map; +import java.util.Set; + +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; + +import com.knecon.fforesight.tenantcommons.TenantProvider; +import com.knecon.fforesight.tenantcommons.model.TenantCreatedEvent; +import com.knecon.fforesight.tenantcommons.model.TenantQueueConfiguration; +import com.knecon.fforesight.tenantcommons.model.TenantResponse; +import com.knecon.fforesight.tenantcommons.queue.RabbitQueueFromExchangeService; +import com.knecon.fforesight.tenantcommons.queue.TenantExchangeMessageReceiver; + +@Service +public class TenantExchangeMessageReceiverImpl extends TenantExchangeMessageReceiver { + + public TenantExchangeMessageReceiverImpl(RabbitQueueFromExchangeService rabbitQueueService, TenantProvider tenantProvider) { + + super(rabbitQueueService, tenantProvider); + } + + + @Override + protected Set getTenantQueueConfigs() { + + return Set.of(TenantQueueConfiguration.builder() + .listenerId(OcrMessageReceiver.OCR_REQUEST_LISTENER_ID) + .exchangeName(OCR_REQUEST_EXCHANGE) + .queuePrefix(OCR_REQUEST_QUEUE_PREFIX) + .dlqName(OCR_DLQ) + .arguments(Map.of("x-max-priority", 2)) + .build()); + } + + + @EventListener(ApplicationReadyEvent.class) + public void onApplicationReady() { + + System.out.println("application ready invoked"); + super.initializeQueues(); + } + + + @RabbitHandler + @RabbitListener(queues = TENANT_CREATED_EVENT_QUEUE) + public void reactToTenantCreation(TenantCreatedEvent tenantCreatedEvent) { + + super.reactToTenantCreation(tenantCreatedEvent); + } + + + @RabbitHandler + @RabbitListener(queues = TENANT_DELETED_EVENT_QUEUE) + public void reactToTenantDeletion(TenantResponse tenantResponse) { + + super.reactToTenantDeletion(tenantResponse); + + } + +}