執行監聽器( Execution listener)


相關類:

  • org.activiti.engine.delegate.ExecutionListener
  • org.activiti.engine.delegate.TaskListener 
  • org.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);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM