diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/ComponentDroolsExecutionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/ComponentDroolsExecutionService.java index cc42ffca..f25ad1d4 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/ComponentDroolsExecutionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/ComponentDroolsExecutionService.java @@ -2,7 +2,13 @@ package com.iqser.red.service.redaction.v1.server.service.drools; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +import com.iqser.red.service.redaction.v1.server.utils.exception.DroolsTimeoutException; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.QueryResults; @@ -39,7 +45,23 @@ public class ComponentDroolsExecutionService { entityLog.getEntityLogEntry().stream().map(Entity::fromEntityLogEntry).forEach(kieSession::insert); fileAttributes.stream().filter(f -> f.getValue() != null).forEach(kieSession::insert); - kieSession.fireAllRules(); + CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> { + kieSession.fireAllRules(); + return null; + }); + + try { + completableFuture.orTimeout(settings.getDroolsExecutionTimeoutSecs(), TimeUnit.SECONDS).get(); + } catch (ExecutionException e) { + kieSession.dispose(); + if(e.getCause() instanceof TimeoutException){ + throw new DroolsTimeoutException(e, false, RuleFileType.COMPONENT); + } + throw new RuntimeException(e); + } catch (InterruptedException e) { + kieSession.dispose(); + throw new RuntimeException(e); + } List resultingFileAttributes = getFileAttributes(kieSession); List components = getComponents(kieSession); diff --git a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/EntityDroolsExecutionService.java b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/EntityDroolsExecutionService.java index db855a55..82b4883b 100644 --- a/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/EntityDroolsExecutionService.java +++ b/redaction-service-v1/redaction-service-server-v1/src/main/java/com/iqser/red/service/redaction/v1/server/service/drools/EntityDroolsExecutionService.java @@ -2,7 +2,13 @@ package com.iqser.red.service.redaction.v1.server.service.drools; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import com.iqser.red.service.persistence.service.v1.api.shared.model.RuleFileType; +import com.iqser.red.service.redaction.v1.server.utils.exception.DroolsTimeoutException; import org.kie.api.runtime.KieContainer; import org.kie.api.runtime.KieSession; import org.kie.api.runtime.rule.QueryResults; @@ -87,7 +93,24 @@ public class EntityDroolsExecutionService { kieSession.getAgenda().getAgendaGroup("LOCAL_DICTIONARY_ADDS").setFocus(); - kieSession.fireAllRules(); + + CompletableFuture completableFuture = CompletableFuture.supplyAsync(() -> { + kieSession.fireAllRules(); + return null; + }); + + try { + completableFuture.orTimeout(settings.getDroolsExecutionTimeoutSecs(), TimeUnit.SECONDS).get(); + } catch (ExecutionException e) { + kieSession.dispose(); + if(e.getCause() instanceof TimeoutException){ + throw new DroolsTimeoutException(e, false, RuleFileType.ENTITY); + } + throw new RuntimeException(e); + } catch (InterruptedException e) { + kieSession.dispose(); + throw new RuntimeException(e); + } List resultingFileAttributes = getFileAttributes(kieSession); kieSession.dispose();