03-23-2017 03:33 AM
Hi, I am trying to execute the service task via variable.
When I am using literal in the service task it works. But when I assign the variable with the same literal it doesnt work.
CASE 1: Using literal in delegateExpression
Below is an example
Process XML
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlnsmgdc="http://www.omg.org/spec/DD/20100524/DC" xmlnsmgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="test1" name="test1" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<serviceTask id="servicetask1" name="Service Task" activiti:delegateExpression="${LineManagerCompletionService}"></serviceTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="servicetask1" targetRef="endevent1"></sequenceFlow>
<dataObject id="assignee" name="assignee" itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value></activiti:value>
</extensionElements>
</dataObject>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_test1">
<bpmndi:BPMNPlane bpmnElement="test1" id="BPMNPlane_test1">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="280.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="910.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="servicetask1" id="BPMNShape_servicetask1">
<omgdc:Bounds height="55.0" width="105.0" x="520.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="315.0" y="227.0"></omgdi:waypoint>
<omgdi:waypoint x="520.0" y="237.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="625.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="910.0" y="227.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
@Named("LineManagerCompletionService")
public class LineManagerCompletionService implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
System.out.println("******Saving LM Decision******");
}
}
Case 2 : Using Delegate Expression as Variable
XML
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlnsmgdc="http://www.omg.org/spec/DD/20100524/DC" xmlnsmgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
<process id="test1" name="test1" isExecutable="true">
<startEvent id="startevent1" name="Start"></startEvent>
<endEvent id="endevent1" name="End"></endEvent>
<serviceTask id="servicetask1" name="Service Task" activiti:delegateExpression="${assignee}"></serviceTask>
<sequenceFlow id="flow1" sourceRef="startevent1" targetRef="servicetask1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="servicetask1" targetRef="endevent1"></sequenceFlow>
<dataObject id="assignee" name="assignee" itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>LineManagerCompletionService</activiti:value>
</extensionElements>
</dataObject>
</process>
<bpmndi:BPMNDiagram id="BPMNDiagram_test1">
<bpmndi:BPMNPlane bpmnElement="test1" id="BPMNPlane_test1">
<bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
<omgdc:Bounds height="35.0" width="35.0" x="280.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
<omgdc:Bounds height="35.0" width="35.0" x="910.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNShape bpmnElement="servicetask1" id="BPMNShape_servicetask1">
<omgdc:Bounds height="55.0" width="105.0" x="520.0" y="210.0"></omgdc:Bounds>
</bpmndi:BPMNShape>
<bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
<omgdi:waypoint x="315.0" y="227.0"></omgdi:waypoint>
<omgdi:waypoint x="520.0" y="237.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
<bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
<omgdi:waypoint x="625.0" y="237.0"></omgdi:waypoint>
<omgdi:waypoint x="910.0" y="227.0"></omgdi:waypoint>
</bpmndi:BPMNEdge>
</bpmndi:BPMNPlane>
</bpmndi:BPMNDiagram>
</definitions>
Failure Trace
org.activiti.engine.ActivitiIllegalArgumentException: Delegate expression ${assignee} did neither resolve to an implementation of interface org.activiti.engine.impl.pvm.delegate.ActivityBehavior nor interface org.activiti.engine.delegate.JavaDelegate
at org.activiti.engine.impl.bpmn.behavior.ServiceTaskDelegateExpressionActivityBehavior.execute(ServiceTaskDelegateExpressionActivityBehavior.java:100)
03-23-2017 05:01 AM
A delegateExpression, as the name implies, must implement the JavaDelegate or ActivitiBehavior interface.
Obviously the ${assignee} expression doent resolve to such a class.
I am not sure what your ${assignee} class actually resolves to so cannot offer a solution, but you may consider using an Expression rather than a DelegateExpression.
Thanks,
Greg
03-23-2017 06:13 AM
assignee is my process variable and I have set the value of assignee to "LineManagerCompletionService"
<dataObject id="assignee" name="assignee" itemSubjectRef="xsd:string">
<extensionElements>
<activiti:value>LineManagerCompletionService</activiti:value>
</extensionElements>
</dataObject>
When I put DelegateExpression = ${LineManagerCompletionService}. It works.(Case 1 in my example)
But when I put DelegateExpression = ${assignee} i get this error. (Case 2 in my example)
Basically I want to execute the service task based on process variable value, which can be initialized at the start of process. So that I dont have to create multiple workflow defn only because my service task is different.
03-23-2017 07:45 AM
Yeah, what you need to do is use the working syntax:
<serviceTask id="servicetask1" name="Service Task" activiti:delegateExpression="${LineManagerCompletionService}">
And add the assignee as an input property. Simple enough to do and the users guide has examples as well as the test suite.
Greg
03-24-2017 12:47 AM
Hi Greg,
Thanks a lot for reply. Not sure if I explained my problem correctly.
I am NOT trying to do field injection. My problem is quite different.
For e.g. I have more than one Class which implements JavaDelegate.
@Named("LineManagerCompletionService1")
public class LineManagerCompletionService1 implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
System.out.println("******Saving LM Decision=====1******");
}
}
@Named("LineManagerCompletionService2")
public class LineManagerCompletionService2 implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
System.out.println("******Saving LM Decision=====2******");
}
}
@Named("LineManagerCompletionService3")
public class LineManagerCompletionService3 implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
System.out.println("******Saving LM Decision====3******");
}
}
And I want to execute any of the different beans(bean name can be provided as input parameter at start of the workflow) from same JAVA Service tasks without modifying my process defn.
I hope this makes this clear now. Also can you please point me where its exactly mentioned in User Guide?
Explore our Alfresco products with the links below. Use labels to filter content by product module.