From f03523ca8f49767b22d551023866dc9948c06e9f Mon Sep 17 00:00:00 2001 From: deiflaender Date: Mon, 27 Mar 2023 09:37:48 +0200 Subject: [PATCH] RED-6224: Multitenancy for rules cache --- .../server/redaction/model/TenantRules.java | 15 ++++ .../service/DroolsExecutionService.java | 69 +++++++++++++++---- 2 files changed, 70 insertions(+), 14 deletions(-) create mode 100644 redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/TenantRules.java diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/TenantRules.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/TenantRules.java new file mode 100644 index 00000000..eff0a617 --- /dev/null +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/model/TenantRules.java @@ -0,0 +1,15 @@ +package com.iqser.red.service.redaction.v1.server.redaction.model; + +import java.util.HashMap; +import java.util.Map; + +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +public class TenantRules { + + private Map rulesVersionPerDossierTemplateId = new HashMap<>(); + +} diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java index 6905fb63..eaaa9b63 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/redaction/service/DroolsExecutionService.java @@ -1,11 +1,13 @@ package com.iqser.red.service.redaction.v1.server.redaction.service; -import com.iqser.red.service.redaction.v1.server.client.RulesClient; -import com.iqser.red.service.redaction.v1.server.exception.RulesValidationException; -import com.iqser.red.service.redaction.v1.server.redaction.model.Section; +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; -import io.micrometer.core.annotation.Timed; -import lombok.RequiredArgsConstructor; +import javax.annotation.PostConstruct; import org.apache.commons.lang3.StringUtils; import org.kie.api.KieServices; @@ -16,11 +18,19 @@ import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.springframework.stereotype.Service; -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.HashMap; -import java.util.Map; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.iqser.red.service.redaction.v1.server.client.RulesClient; +import com.iqser.red.service.redaction.v1.server.exception.RulesValidationException; +import com.iqser.red.service.redaction.v1.server.multitenancy.TenantContext; +import com.iqser.red.service.redaction.v1.server.redaction.model.Section; +import com.iqser.red.service.redaction.v1.server.redaction.model.TenantRules; +import com.iqser.red.service.redaction.v1.server.settings.RedactionServiceSettings; + +import io.micrometer.core.annotation.Timed; +import lombok.RequiredArgsConstructor; +import lombok.SneakyThrows; @Service @RequiredArgsConstructor @@ -30,7 +40,24 @@ public class DroolsExecutionService { private final Map kieContainers = new HashMap<>(); - private final Map rulesVersionPerDossierTemplateId = new HashMap<>(); + private final RedactionServiceSettings settings; + + private LoadingCache tenantRulesCache; + + + @PostConstruct + protected void createCache() { + + tenantRulesCache = CacheBuilder.newBuilder() + .maximumSize(settings.getDictionaryCacheMaximumSize()) + .expireAfterAccess(settings.getDictionaryCacheExpireAfterAccessDays(), TimeUnit.DAYS) + .build(new CacheLoader<>() { + public TenantRules load(String key) { + + return new TenantRules(); + } + }); + } public KieContainer getKieContainer(String dossierTemplateId) { @@ -61,13 +88,13 @@ public class DroolsExecutionService { public KieContainer updateRules(String dossierTemplateId) { long version = rulesClient.getVersion(dossierTemplateId); - Long rulesVersion = rulesVersionPerDossierTemplateId.get(dossierTemplateId); + Long rulesVersion = getVersionForDossierTemplate(dossierTemplateId); if (rulesVersion == null) { rulesVersion = -1L; } if (version > rulesVersion) { - rulesVersionPerDossierTemplateId.put(dossierTemplateId, version); + setRulesVersionForDossierTemplate(dossierTemplateId, version); return createOrUpdateKieContainer(dossierTemplateId); } return getKieContainer(dossierTemplateId); @@ -126,11 +153,25 @@ public class DroolsExecutionService { public long getRulesVersion(String dossierTemplateId) { - Long rulesVersion = rulesVersionPerDossierTemplateId.get(dossierTemplateId); + Long rulesVersion = getVersionForDossierTemplate(dossierTemplateId); if (rulesVersion == null) { return -1; } return rulesVersion; } + + @SneakyThrows + private Long getVersionForDossierTemplate(String dossierTemplateId) { + + return tenantRulesCache.get(TenantContext.getTenantId()).getRulesVersionPerDossierTemplateId().get(dossierTemplateId); + } + + + @SneakyThrows + private void setRulesVersionForDossierTemplate(String dossierTemplateId, long version) { + + tenantRulesCache.get(TenantContext.getTenantId()).getRulesVersionPerDossierTemplateId().put(dossierTemplateId, version); + } + }