相關類:
org.activiti.engine.delegate.ExecutionListenerorg.activiti.engine.delegate.TaskListenerorg.activiti.engine.delegate.Expression
在流程實例執行的過程中觸發某個事件時,執行監聽器允許你去執行額外的java代碼或者對指定的表達式求值。可以被捕捉的事件有:
-
Start and ending of a process instance.
-
Taking a transition.
-
Start and ending of an activity.
-
Start and ending of a gateway.
-
Start and ending of intermediate events.
-
Ending a start event or starting an end event.
包含3個執行監聽器的流程定義:
<process id="executionListenersProcess"> <extensionElements> <activiti:executionListener class="org.activiti.examples.bpmn.executionlistener.ExampleExecutionListenerOne" event="start" /> </extensionElements> <startEvent id="theStart" /> <sequenceFlow sourceRef="theStart" targetRef="firstTask" /> <userTask id="firstTask" /> <sequenceFlow sourceRef="firstTask" targetRef="secondTask"> <extensionElements> <activiti:executionListener class="org.activiti.examples.bpmn.executionListener.ExampleExecutionListenerTwo" /> </extensionElements> </sequenceFlow> <userTask id="secondTask" > <extensionElements> <activiti:executionListener expression="${myPojo.myMethod(execution.event)}" event="end" /> </extensionElements> </userTask> <sequenceFlow sourceRef="secondTask" targetRef="thirdTask" /> <userTask id="thirdTask" /> <sequenceFlow sourceRef="thirdTask" targetRef="theEnd" /> <endEvent id="theEnd" /> </process>
當進程啟動時,將通知第一個執行偵聽器。偵聽器是一個外部java類(如ExampleExecutionListenerOne),它應該實現org.activiti.engine.delegate.ExecutionListener接口。當事件發生時(在本用例中為end事件),方法nitify會被調用。
public class ExampleExecutionListenerOne implements ExecutionListener { public void notify(ExecutionListenerExecution execution) throws Exception { execution.setVariable("variableSetInExecutionListener", "firstValue"); execution.setVariable("eventReceived", execution.getEventName()); } }
它也可以是一個實現了org.activiti.engine.delegate.JavaDelegate接口的委托類,這些委托類可以在其它的結構中重用,比如serviceTask的delegation。
當執行過渡時( when the transition is taken)第二個偵聽器會被調用。注意listener 元素沒有定義event屬性,因為在過渡的時候,只會觸發take事件。當在過渡中(sequenceFlow 元素)定義偵聽器時,event屬性中的值將被忽略。
當活動secondTask結束時會調用第三個執行偵聽器。在偵聽器的申明中沒有使用class屬性,而是使用expression 屬性定義了一個表達式
<activiti:executionListener expression="${myPojo.myMethod(execution.eventName)}" event="end" />
與其他表達式一樣,執行變量execution 可以被解析使用。因為執行實現對象擁有一個暴露事件名的屬性,所以可以使用execution.eventName將事件名稱傳遞給您的方法。
執行偵聽器也支持delegateExpression 類似於service Task
<activiti:executionListener event="start" delegateExpression="${myExecutionListenerBean}" />
執行偵聽器還支持script execution listener,需要實現 org.activiti.engine.impl.bpmn.listener.ScriptExecutionListener接口
<activiti:executionListener event="start" class="org.activiti.engine.impl.bpmn.listener.ScriptExecutionListener" > <activiti:field name="script"> <activiti:string> def bar = "BAR"; // local variable foo = "FOO"; // pushes variable to execution context execution.setVariable("var1", "test"); // test access to execution instance bar // implicit return value </activiti:string> </activiti:field> <activiti:field name="language" stringValue="groovy" /> <activiti:field name="resultVariable" stringValue="myVar" /> </activiti:executionListener>
將屬性注入到執行偵聽器中
當執行偵聽器是通過class屬性指定的,我們可以為實例化后的對象注入屬性。
執行偵聽器屬性注入的一個簡單例子:
<process id="executionListenersProcess"> <extensionElements> <activiti:executionListener class="org.activiti.examples.bpmn.executionListener.ExampleFieldInjectedExecutionListener" event="start"> <activiti:field name="fixedValue" stringValue="Yes, I am " /> <activiti:field name="dynamicValue" expression="${myVar}" /> </activiti:executionListener> </extensionElements> <startEvent id="theStart" /> <sequenceFlow sourceRef="theStart" targetRef="firstTask" /> <userTask id="firstTask" /> <sequenceFlow sourceRef="firstTask" targetRef="theEnd" /> <endEvent id="theEnd" /> </process>
public class ExampleFieldInjectedExecutionListener implements ExecutionListener { private Expression fixedValue; private Expression dynamicValue; public void notify(ExecutionListenerExecution execution) throws Exception { execution.setVariable("var", fixedValue.getValue(execution).toString() + dynamicValue.getValue(execution).toString()); } }
@Deployment(resources = {"org/activiti/examples/bpmn/executionListener/ExecutionListenersFieldInjectionProcess.bpmn20.xml"})
public void testExecutionListenerFieldInjection() {
Map<String, Object> variables = new HashMap<String, Object>();
variables.put("myVar", "listening!");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("executionListenersProcess", variables);
Object varSetByListener = runtimeService.getVariable(processInstance.getId(), "var");
assertNotNull(varSetByListener);
assertTrue(varSetByListener instanceof String);
// Result is a concatenation of fixed injected field and injected expression
assertEquals("Yes, I am listening!", varSetByListener);
}
