04-23-2018 10:06 AM
Hi I am new to Activiti Framework, Can someone please give information on how can we do exception handling in activiti v6.0.0 . Please attach a sample bpmn xml file with exception as a service task, and also the exception class(java code) if possible.
I found this while searching for info on exception handling, but this code doesn't work for v6.0.0. It only works for v5.19.0.
Exception Class:
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.delegate.ActivityBehavior;
import org.activiti.engine.impl.pvm.delegate.ActivityExecution;
public class ThrowsExceptionBehavior implements ActivityBehavior {
private static final long serialVersionUID = 1L;
private org.activiti.engine.impl.el.FixedValue text;
private org.activiti.engine.impl.el.Expression exp;
public void execute(ActivityExecution execution) throws Exception {
//String text = (String) execution.getVariable("text");
PvmTransition transition = null;
try {
System.out.println("In ThrowsExceptionBehavior class: "+ text);
//throw new Exception("Activiti Exception");
transition = execution.getActivity().findOutgoingTransition("no-exception");
} catch (Exception e) {
transition = execution.getActivity().findOutgoingTransition("exception");
}
execution.take(transition);
}
}
BPMN File :
<startEvent id="startevent1" name="Start"></startEvent>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetaskCustom"></sequenceFlow>
<serviceTask id="servicetaskCustom" name="test" activiti:class = "@ThrowsExceptionBehavior" >
<extensionElements>
<activiti:field name="text" stringValue="Hello World" />
</extensionElements>
</serviceTask>
<sequenceFlow id="no-exception" sourceRef="servicetaskCustom" targetRef="endevent1" />
<sequenceFlow id="exception" sourceRef="servicetaskCustom" targetRef="fixException" />
<serviceTask id="fixException" name="print" activiti:expression="#{result.print()}"></serviceTask>
<sequenceFlow id="exceptionOccurred" sourceRef="fixException" targetRef="endevent1" />
04-24-2018 02:11 AM
Hi,
The way in which I do is, I define a condition on the outgoing transitions. One will have something like ${Path=="Success"} and other will have something like ${Path=="HandleException"}.
My service task will have code something as below.
try {
System.out.println("In Service Task");
// Do something
execution.setVariable("Path","Success")
} catch (Exception e) {
execution.setVariable("Path","HandleException")
}
04-24-2018 03:57 AM
I would also suggest to really think about if you want to handle an exception in the process model or if it is a technical matter. If it is a technical matter and not an exceptional business path you should deal with it in Java behind the scenes.
04-24-2018 08:05 AM
i want to handle some business exceptions as well.
04-24-2018 08:29 AM
Business Exceptions are fine.. just make sure that those are not Java Exceptions.
04-24-2018 08:44 AM
but i need more clarity on how to do this in activiti 6.0.0. Can you please provide more details on this ?
04-24-2018 08:04 AM
can u tell me are you using exclusive gateways to manage your conditions in the bpmn xml file ?
04-25-2018 12:02 AM
I am using this as exclusive gateway in my bpmn xml file.
<exclusiveGateway id="exceptionOccured" name="exceptionOccured"/>
<sequenceFlow id="exception" sourceRef="exceptionOccured"
targetRef="catchException">
<conditionExpression xsi:type="tFormalExpression"><![CDATA[${Path == "HandleException"}]]>
</conditionExpression>
</sequenceFlow>
<sequenceFlow id="no-exception" sourceRef="exceptionOccured"
targetRef="endevent1">
<conditionExpression xsi:type="tFormalExpression">${Path != "HandleException"}
</conditionExpression>
</sequenceFlow>
But it throws below exception :
org.activiti.engine.ActivitiException: Unknown property used in expression: ${Path == "HandleException"}
at org.activiti.engine.impl.el.JuelExpression.getValue(JuelExpression.java:52) ~[activiti-engine-6.0.0.jar:6.0.0]
I am setting the Path Variable in the catch block of my java task code
try{
//do something
}
catch (Exception e) {
logger.error("rest call failed " + e.getMessage() +e.getMessage());
new ThrowsExceptionBehavior() {
private static final long serialVersionUID = 1L;
@Override
public void execute(DelegateExecution execution) {
execution.setVariable("Path", "HandleException");
}
};
}
04-25-2018 12:51 AM
Hi,
You should atleast keep the variable available in your process by the time it reaches your exclusive gateway. The problem above is that you are setting the variable Path a value only when the you come across an exception. This means that when there is no exception, variable Path is unknown. That was the reason for your exception.
If you look at how I did this, irrespective of whether I see an exception or not, I am setting the value for variable Path.
try {
System.out.println("In Service Task");
// Do something
execution.setVariable("Path","Success")
} catch (Exception e) {
execution.setVariable("Path","HandleException")
}
Explore our Alfresco products with the links below. Use labels to filter content by product module.