`
wangmingyue
  • 浏览: 44904 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

执行监听器 ExecutionListener

 
阅读更多

执行监听器可以执行外部java代码或执行表达式,当流程定义中发生了某个事件。 可以捕获的事件有:

  • 流程实例的启动和结束。

  • 选中一条连线。

  • 节点的开始和结束。

  • 网关的开始和结束。

  • 中间事件的开始和结束。

  • 开始时间结束或结束事件开始。

下面的流程定义包含了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事件),会调用notify(ExecutionListenerExecution execution)方法。

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的代理。

第二个流程监听器在连线执行时调用。注意这个listener元素不能定义event, 因为连线只能触发take事件。 为连线定义的监听器的event属性会被忽略。

最后一个流程监听器在节点secondTask结束时调用。这里使用expression 代替class来在事件触发时执行/调用。

<activiti:executionListener expression="${myPojo.myMethod(execution.eventName)}" event="end" />

和其他表达式一样,流程变量可以处理和使用。因为流程实现对象有一个保存事件名称的属性, 可以在方法中使用execution.eventName获的事件名称。

流程监听器也支持使用delegateExpression, 和服务任务相同

<activiti:executionListener event="start" delegateExpression="${myExecutionListenerBean}" />

在activiti 5.12中,我们也介绍了新的流程监听器,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());
 }
}
     

ExampleFieldInjectedExecutionListener类串联了两个注入的属性。 (一个是固定的,一个是动态的),把他们保存到流程变量'var'中。

@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);
}
    
分享到:
评论

相关推荐

    流程节点图高亮.zip

    1. **创建监听器**: 创建一个实现了`org.activiti.engine.delegate.ExecutionListener`接口的类,覆盖`onExecutionEvent`方法,根据事件类型判断节点状态并发送更新颜色的指令。 2. **部署监听器**: 将监听器部署到...

    elastic-job-lite-console-2.1.5

    7. **扩展性**:Elastic-Job设计上具有很好的扩展性,如支持自定义ShardingStrategy(分片策略)和ExecutionListener(执行监听器),允许开发者根据业务需求定制任务的分片规则和执行过程。 综上所述,Elastic-Job...

    工作流Activiti的学习总结Activiti5.6和Spring3.03整合

    这两个任务都有各自的扩展元素`&lt;extensionElements&gt;`,其中包含了一个执行监听器`&lt;activiti:executionListener&gt;`。监听器允许我们在特定事件(如任务开始)时执行自定义逻辑,例如调用`...

    springboot 2.0 集成 Activiti5.22包括流程跟踪和在线设计

    例如,你可以定义一个监听器类,扩展`org.activiti.engine.delegate.ExecutionListener`接口,并在流程节点的进入或退出时记录相关信息。 在线设计则意味着用户可以直接在Web界面中绘制和编辑流程图。Activiti提供...

    activiti-5.22.0.zip

    `org.activiti.engine.delegate.ExecutionListener` 和 `org.activiti.engine.delegate.TaskListener` 是常见的监听器接口,开发者可以通过实现这些接口来自定义行为。 8. **数据库交互**:Activiti 使用自身的持久...

    Activiti-develop

    - Activiti 提供了各种监听器接口,如 `ExecutionListener`、`TaskListener`,可在流程执行的关键节点执行自定义逻辑。 - 可通过监听器实现日志记录、业务逻辑集成、异常处理等功能。 7. ** Activiti 的扩展性** ...

    elastic-job-lite-console-3.0.0.M1-SNAPSHOT.tar.gz

    3. **ExecutionListener** 和 **JobListener**:监听器,提供任务执行前后的回调功能,可以用来记录日志、监控状态等。 Elastic-Job-Lite 3.0.0.M1-SNAPSHOT是该框架的一个里程碑版本,其中可能包含了以下改进和新...

    Activiti Modeler java参考代码.rar

    你可以自定义监听器类,通过实现`ExecutionListener`、`TaskListener`接口,然后在流程定义中配置它们。 7. **服务调用和服务任务** 在流程中,经常需要调用外部服务。这可以通过定义服务任务并绑定Java类来实现。...

    lhr-spring-mvc-activiti

    1. 可以通过实现Activiti的TaskListener接口,自定义任务监听器,监听特定的任务事件。 2. 通过实现ExecutionListener或ActivityBehavior,可以监听流程实例的执行事件,实现业务逻辑的定制。 九、页面展示与交互 1...

    activiti-spring-5.7.jar.zip

    Activiti提供了丰富的事件监听机制,开发者可以通过实现不同的监听器接口,如`TaskListener`和`ExecutionListener`,并在Spring配置文件中声明,实现在流程执行过程中的自定义逻辑。 7. **服务调用与业务集成**: ...

    ActivitiDemo

    开发者可以通过实现 `ExecutionListener` 或 `TaskListener` 接口来编写自定义监听器。 8. **表单和用户界面(Forms and User Interfaces)**:为了与用户交互,流程中的任务通常关联有表单。Activiti 支持与外部...

Global site tag (gtag.js) - Google Analytics