From fc4ad847c984cdf85c292938bcfb0dc65dff1302 Mon Sep 17 00:00:00 2001 From: carlos.alberto Date: Thu, 24 Mar 2016 18:17:35 -0300 Subject: [PATCH] Melhoria no controle de exceção do workflow --- cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/model/ProcessInstance.java | 1 + cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/ProcessInstanceServiceBase.java | 4 +--- cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/ProcessInstanceServiceBaseImpl.java | 142 +++++++++++++++++++++++++++++++++------------------------------------------------------------------------------------------------------------- cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/WorkItemServiceImpl.java | 30 ++++++++++++++---------------- cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironment.java | 10 ++++++++++ cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironmentImpl.java | 15 +++++++++++++++ cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/service/impl/RuntimeManagerBaseImpl.java | 62 +++++++++++++++++++++++++++++++++++++++++++++----------------- 7 files changed, 119 insertions(+), 145 deletions(-) diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/model/ProcessInstance.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/model/ProcessInstance.java index e3f8e0d..f9ca344 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/model/ProcessInstance.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/model/ProcessInstance.java @@ -259,6 +259,7 @@ public class ProcessInstance extends PersistentObject implements Serializable { if (runtimeEnvironment != null) { this.setRuntimeEnvironment(runtimeEnvironment); this.setRuntimeId(runtimeEnvironment.getRuntimeId()); + runtimeEnvironment.addProcessInstance(this); } } diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/ProcessInstanceServiceBase.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/ProcessInstanceServiceBase.java index 09eef64..7beca01 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/ProcessInstanceServiceBase.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/ProcessInstanceServiceBase.java @@ -22,8 +22,6 @@ public interface ProcessInstanceServiceBase extends GenericService findByOriginWorkItem(WorkItem workItem); @@ -49,7 +47,7 @@ public interface ProcessInstanceServiceBase extends GenericService files); diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/ProcessInstanceServiceBaseImpl.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/ProcessInstanceServiceBaseImpl.java index 8bed7af..6e3d07b 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/ProcessInstanceServiceBaseImpl.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/ProcessInstanceServiceBaseImpl.java @@ -53,8 +53,6 @@ import br.com.centralit.esi.api.security.model.User; import br.com.centralit.esi.api.security.service.SecurityService; import br.com.centralit.esi.api.subscriber.model.Subscriber; import br.com.centralit.esi.api.util.EsiAppUtils; -import br.com.centralit.esi.exception.EsiControlledException; -import br.com.centralit.esi.exception.EsiExecutionException; import br.com.centralit.framework.exception.BusinessException; import br.com.centralit.framework.mail.HTMLMail; import br.com.centralit.framework.service.arquitetura.GenericServiceImpl; @@ -144,7 +142,7 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.verifyOriginWorkItem(runtimeEnvironment, processInstance); - if (processInstance.isSendCompletionNotification()) { + if (!processInstance.hasError() && processInstance.isSendCompletionNotification()) { this.addMessage(runtimeEnvironment, processInstance, processInstance.getCompletionTemplate(), this.getSubscribersUsers(processInstance), this.getSubscribersGroups(processInstance), null); } } @@ -216,51 +214,7 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< return new ArrayList(); } } - - @Override - public boolean isPersistent(ProcessInstance processInstance) { - boolean result = false; - if (!processInstance.hasOwner()) { - result = processInstance.hasError() || this.hasPersistentChild(processInstance); - if (!result) { - result = processInstance.getFlowVersion().getPersistentExecution() != null && processInstance.getFlowVersion().getPersistentExecution(); - } - } - return result; - } - - private boolean hasPersistentChild(ProcessInstance processInstance) { - boolean result = false; - if (processInstance.hasChildren()) { - for (ProcessInstance child : processInstance.getChildren()) { - if (this.isPersistent(child)) { - result = true; - break; - } - } - } - return result; - } - protected void solveException(ProcessInstance processInstance) { - if (processInstance.hasException() && processInstance.isStopOnException()) { - Throwable e = processInstance.getException(); - if (processInstance.hasOwner()) { - if (e instanceof EsiControlledException) { - throw (EsiControlledException) e; - }else{ - throw new EsiControlledException(e); - } - }else{ - if (e instanceof EsiExecutionException) { - throw (EsiExecutionException) e; - }else{ - throw new EsiExecutionException(e); - } - } - } - } - protected void updateVariables(ProcessInstance processInstance, boolean force) { if (processInstance.getFlowVersion().getVariables() != null) { RuntimeEnvironment runtimeEnvironment = processInstance.getRuntimeEnvironment(); @@ -280,7 +234,7 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< instanceVariable.setProcessInstance(processInstance); instanceVariable.setFlowVariable(flowVariable); instanceVariable.buildValues(obj); - if ((force || this.isPersistent(processInstance)) && flowVariable.getPersistentVariable() != null && flowVariable.getPersistentVariable()) { + if ((force || processInstance.isPersistentExecution()) && flowVariable.getPersistentVariable() != null && flowVariable.getPersistentVariable()) { instanceVariable = processInstanceVariableService.save(instanceVariable); } processInstance.addVariable(instanceVariable); @@ -404,51 +358,11 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< } } - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public ProcessInstance saveOrUpdate(RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance, boolean force) { - if (this.isPersistent(processInstance) || force) { - List newWorkItems = processInstance.getNewWorkItems(); - - this.initializeTimeManagementStatus(processInstance); - if (processInstance.isNew()) { - processInstance = this.save(processInstance); - }else{ - processInstance = this.merge(processInstance); - } - - while (newWorkItems.size() > 0) { - WorkItem workItem = newWorkItems.get(0); - WorkItemService workItemService = runtimeContext.getWorkItemService(workItem.getFlowElement()); - workItem = (WorkItem) workItemService.save(workItem); - workItemService.afterRegistry(processInstance.getRuntimeEnvironment(), workItem); - this.solveTimeManagementStatus(processInstance, workItem); - newWorkItems.remove(0); - } - - this.updateVariables(processInstance, force); - - if (processInstance.hasChildren()) { - for (ProcessInstance child : processInstance.getChildren()) { - this.saveOrUpdate(runtimeEnvironment, child, true); - } - } - - this.sendMessages(runtimeEnvironment, processInstance); - } - return processInstance; - } protected ProcessInstance getProcessInstance(WorkItem workItem) { return workItem.getProcessInstance(); } - - protected ProcessInstance finalize(RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance) { - this.solveException(processInstance); - return processInstance; - } - @Override public void sendMessages(RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance) { if ((EsiAppUtils.BPE_SEND_EMAIL || EsiAppUtils.BPE_SEND_NOTIFICATION) && processInstance.getMessages() != null) { @@ -556,7 +470,7 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< throw new BusinessException("Elemento de início do fluxo '"+runtimeEnvironment.getFlowName()+"' não existe."); ProcessInstance processInstance = this.createInstance(runtimeEnvironment, originWorkItem, flowVersion); - if (this.isPersistent(processInstance)) { + if (processInstance.isPersistentExecution()) { processInstance = super.save(processInstance); } @@ -568,13 +482,11 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.go(runtimeEnvironment, processInstance, elementoInicio); - if (processInstance.isSendCreationNotification()) { + if (!processInstance.hasError() && processInstance.isSendCreationNotification()) { this.addMessage(runtimeEnvironment, processInstance, processInstance.getCreationTemplate(), this.getSubscribersUsers(processInstance), this.getSubscribersGroups(processInstance), null); } - this.saveOrUpdate(runtimeEnvironment, processInstance, false); - - return finalize(runtimeEnvironment, processInstance); + return processInstance; } @Override @@ -590,8 +502,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.initialize(runtimeEnvironment, processInstance); userTaskItem = workItemUserTaskService.capture(runtimeEnvironment, userTaskItem); - - this.saveOrUpdate(runtimeEnvironment, processInstance, true); } protected void validateExecute(RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance, WorkItem workItem) { @@ -609,7 +519,7 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< } @SuppressWarnings({ "rawtypes" }) - public void execute(RuntimeEnvironment runtimeEnvironment, WorkItem workItem) { + protected void execute(RuntimeEnvironment runtimeEnvironment, WorkItem workItem) { if (workItem.getStatus().equals(WorkItemStatusEnum.COMPLETED)) { return; } @@ -632,9 +542,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.go(runtimeEnvironment, processInstance, target); } } - - this.saveOrUpdate(runtimeEnvironment, processInstance, processInstance.isPersistentExecution()); - this.finalize(runtimeEnvironment, processInstance); } @Override @@ -670,8 +577,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.initialize(runtimeEnvironment, processInstance); workItemUserTaskService.delegate(runtimeEnvironment, userTaskItem, userTaskItem.getGroups(), userTaskItem.getUsers()); - - this.finalize(runtimeEnvironment, processInstance); } @Override @@ -689,8 +594,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.initialize(runtimeEnvironment, processInstance); workItemUserTaskService.removeDelegation(runtimeEnvironment, userTaskItem, userTaskItem.getGroups(), userTaskItem.getUsers()); - - this.finalize(runtimeEnvironment, processInstance); } @Override @@ -708,8 +611,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.initialize(runtimeEnvironment, processInstance); userTaskItem = workItemUserTaskService.capture(runtimeEnvironment, userTaskItem); - - this.saveOrUpdate(runtimeEnvironment, processInstance, true); } @Override @@ -774,10 +675,6 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< this.initialize(runtimeEnvironment, processInstance); this.go(runtimeEnvironment, processInstance, elementoInicio); - - this.saveOrUpdate(runtimeEnvironment, processInstance, true); - - finalize(runtimeEnvironment, processInstance); } @Override @@ -802,4 +699,31 @@ public abstract class ProcessInstanceServiceBaseImpl extends GenericServiceImpl< return processInstanceDao.findByOwner(owner); } + @SuppressWarnings({ "unchecked", "rawtypes" }) + @Override + public ProcessInstance saveOrUpdate(RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance) { + List newWorkItems = processInstance.getNewWorkItems(); + + this.initializeTimeManagementStatus(processInstance); + if (processInstance.isNew()) { + processInstance = this.save(processInstance); + }else{ + processInstance = this.merge(processInstance); + } + + while (newWorkItems.size() > 0) { + WorkItem workItem = newWorkItems.get(0); + WorkItemService workItemService = runtimeContext.getWorkItemService(workItem.getFlowElement()); + workItem = (WorkItem) workItemService.save(workItem); + workItemService.afterRegistry(processInstance.getRuntimeEnvironment(), workItem); + this.solveTimeManagementStatus(processInstance, workItem); + newWorkItems.remove(0); + } + + this.updateVariables(processInstance, true); + + this.sendMessages(runtimeEnvironment, processInstance); + + return processInstance; + } } \ No newline at end of file diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/WorkItemServiceImpl.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/WorkItemServiceImpl.java index de58847..735cc90 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/WorkItemServiceImpl.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/execution/service/impl/WorkItemServiceImpl.java @@ -187,26 +187,24 @@ public class WorkItemServiceImpl extends GenericServiceIm } protected WorkItem solveException(Exception e, RuntimeEnvironment runtimeEnvironment, ProcessInstance processInstance, FlowElement flowElement, WorkItem workItem) { - if (workItem == null) { - workItem = this.register(runtimeEnvironment, processInstance,flowElement); + EsiControlledException controlledException = null; + if (e instanceof EsiControlledException) { + controlledException = (EsiControlledException) e; + }else{ + controlledException = new EsiControlledException(e); } - workItem = this.retrieveErrorEvents(runtimeEnvironment, processInstance, workItem); + + ErrorLog errorLog = errorLogService.create(controlledException); + processInstance.setErrorLog(errorLog); - ErrorLog errorLog = processInstance.getErrorLog(); - if (errorLog == null) { - errorLog = errorLogService.create(e); - processInstance.setErrorLog(errorLog); + if (workItem != null) { + workItem = this.retrieveErrorEvents(runtimeEnvironment, processInstance, workItem); + + workItem.setErrorLog(errorLog); + + processInstance.setStopOnException(!processInstance.isStopOnException() && (workItem.getTargets() == null || workItem.getTargets().size() == 0)); } - workItem.setErrorLog(errorLog); - if (workItem.getTargets() == null) { - processInstance.setStopOnException(true); - if (e instanceof EsiControlledException) { - throw (EsiControlledException) e; - }else{ - throw new EsiControlledException(e); - } - } return workItem; } diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironment.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironment.java index f63fab3..993d1aa 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironment.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironment.java @@ -183,5 +183,15 @@ public interface RuntimeEnvironment { * @return List */ public List getBusinessRules(); + + /** + * Retorna as instâncias do processo do ambiente de execução + */ + public List getInstances(); + + /** + * Adiciona uma instância de processo à lista de instância + */ + public void addProcessInstance(ProcessInstance processInstance); } diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironmentImpl.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironmentImpl.java index 065c27b..bbd4dee 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironmentImpl.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/RuntimeEnvironmentImpl.java @@ -47,6 +47,9 @@ public class RuntimeEnvironmentImpl implements RuntimeEnvironment { @JsonIgnore protected List businessRules; + + @JsonIgnore + protected List instances; @Override public RuntimeEnvironmentInput getInput() { @@ -213,6 +216,7 @@ public class RuntimeEnvironmentImpl implements RuntimeEnvironment { * @param flowName */ private void initialize(RuntimeEnvironmentInput input, FlowVersion flowVersion) { + this.instances = new ArrayList(); this.objects = new MapObjects(); this.initializeAttributes(input, flowVersion, null); this.assignInputVariables(flowVersion, true); @@ -226,6 +230,7 @@ public class RuntimeEnvironmentImpl implements RuntimeEnvironment { * @param processInstance */ private void initialize(ProcessInstance processInstance, RuntimeEnvironmentInput input) { + this.instances = new ArrayList(); this.objects = new MapObjects(); this.initializeAttributes(input, processInstance.getFlowVersion(), processInstance.getRuntimeId()); this.assignInitialValues(processInstance.getFlowVersion(), true); @@ -238,6 +243,7 @@ public class RuntimeEnvironmentImpl implements RuntimeEnvironment { * @param ownerEnvironment */ private void initialize(RuntimeEnvironment ownerEnvironment, FlowVersion flowVersion) { + this.instances = ownerEnvironment.getInstances(); this.objects = ownerEnvironment.getObjects(); this.user = ownerEnvironment.getUser(); @@ -461,4 +467,13 @@ public class RuntimeEnvironmentImpl implements RuntimeEnvironment { } this.addOrUpdateObject(businessRule.getIdentifier(), businessRule); } + + @Override + public void addProcessInstance(ProcessInstance processInstance) { + this.instances.add(processInstance); + } + + public List getInstances() { + return instances; + } } diff --git a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/service/impl/RuntimeManagerBaseImpl.java b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/service/impl/RuntimeManagerBaseImpl.java index 4810f67..cae3740 100644 --- a/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/service/impl/RuntimeManagerBaseImpl.java +++ b/cit-esi-api/src/main/java/br/com/centralit/esi/api/runtime/service/impl/RuntimeManagerBaseImpl.java @@ -92,7 +92,51 @@ public abstract class RuntimeManagerBaseImpl implements RuntimeManagerBase { return runtimeEnvironment; } + protected void solveException(RuntimeActionEnum action, Throwable exception, EnvironmentInput runtimeEnvironmentInput, FlowVersion flowVersion, ProcessInstance processInstance) { + exception.printStackTrace(); + if (!(exception instanceof EsiControlledException) || processInstance == null) { + runtimeLogService.create(action, exception, securityService.getAuthenticatedUser(), runtimeEnvironmentInput, flowVersion, processInstance); + if (exception instanceof EsiControlledException) { + throw (EsiControlledException) exception; + }else{ + throw new EsiControlledException(exception); + } + }else if (exception instanceof RuntimeException) { + throw (RuntimeException) exception; + }else{ + throw new EsiControlledException(exception); + } + } + + protected void verifyException(RuntimeEnvironment runtimeEnvironment) { + if (runtimeEnvironment.getInstances() != null) { + for (ProcessInstance processInstance : runtimeEnvironment.getInstances()) { + if (processInstance.hasException() && processInstance.isStopOnException()) { + Throwable e = processInstance.getException(); + if (e instanceof EsiControlledException) { + throw (EsiControlledException) e; + }else{ + throw new EsiControlledException(e); + } + } + } + } + } + + protected void saveOrUpdateProcessInstances(RuntimeEnvironment runtimeEnvironment) { + if (runtimeEnvironment.getInstances() != null) { + for (ProcessInstance processInstance : runtimeEnvironment.getInstances()) { + if (processInstance.hasError() || processInstance.isPersistentExecution()) { + this.getProcessInstanceService().saveOrUpdate(runtimeEnvironment, processInstance); + } + } + } + } + protected RuntimeEnvironmentOutput finalize(ProcessInstance processInstance, RuntimeEnvironment runtimeEnvironment) { + this.verifyException(runtimeEnvironment); + this.saveOrUpdateProcessInstances(runtimeEnvironment); + return new RuntimeEnvironmentOutput(runtimeEnvironment, processInstance); } @@ -118,7 +162,7 @@ public abstract class RuntimeManagerBaseImpl implements RuntimeManagerBase { ProcessInstance processInstance = this.getProcessInstanceService().start(runtimeEnvironment, originWorkItem, flowVersion); RuntimeEnvironmentOutput output = finalize(processInstance, runtimeEnvironment); - if (createLog && this.getProcessInstanceService().isPersistent(processInstance)) { + if (createLog && (processInstance.isPersistentExecution() || processInstance.hasError())) { runtimeLogService.create( runtimeEnvironment.getInput().isSignal() ? RuntimeActionEnum.SIGNAL_EVENT : flowVersion.isBusinessRule() ? RuntimeActionEnum.BUSINESS_RULE : RuntimeActionEnum.START, null, @@ -195,22 +239,6 @@ public abstract class RuntimeManagerBaseImpl implements RuntimeManagerBase { } } - protected void solveException(RuntimeActionEnum action, Throwable exception, EnvironmentInput runtimeEnvironmentInput, FlowVersion flowVersion, ProcessInstance processInstance) { - exception.printStackTrace(); - if (!(exception instanceof EsiControlledException) || processInstance == null) { - runtimeLogService.create(action, exception, securityService.getAuthenticatedUser(), runtimeEnvironmentInput, flowVersion, processInstance); - if (exception instanceof EsiControlledException) { - throw (EsiControlledException) exception; - }else{ - throw new EsiControlledException(exception); - } - }else if (exception instanceof RuntimeException) { - throw (RuntimeException) exception; - }else{ - throw new EsiControlledException(exception); - } - } - @Override public RuntimeEnvironmentOutput start(RuntimeEnvironment ownerEnvironment, WorkItem originWorkItem, FlowVersion flowVersion) { RuntimeEnvironmentOutput output = null; -- libgit2 0.21.2