执行监听器可以执行外部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);
}
分享到:
相关推荐
1. **创建监听器**: 创建一个实现了`org.activiti.engine.delegate.ExecutionListener`接口的类,覆盖`onExecutionEvent`方法,根据事件类型判断节点状态并发送更新颜色的指令。 2. **部署监听器**: 将监听器部署到...
7. **扩展性**:Elastic-Job设计上具有很好的扩展性,如支持自定义ShardingStrategy(分片策略)和ExecutionListener(执行监听器),允许开发者根据业务需求定制任务的分片规则和执行过程。 综上所述,Elastic-Job...
这两个任务都有各自的扩展元素`<extensionElements>`,其中包含了一个执行监听器`<activiti:executionListener>`。监听器允许我们在特定事件(如任务开始)时执行自定义逻辑,例如调用`...
例如,你可以定义一个监听器类,扩展`org.activiti.engine.delegate.ExecutionListener`接口,并在流程节点的进入或退出时记录相关信息。 在线设计则意味着用户可以直接在Web界面中绘制和编辑流程图。Activiti提供...
`org.activiti.engine.delegate.ExecutionListener` 和 `org.activiti.engine.delegate.TaskListener` 是常见的监听器接口,开发者可以通过实现这些接口来自定义行为。 8. **数据库交互**:Activiti 使用自身的持久...
- Activiti 提供了各种监听器接口,如 `ExecutionListener`、`TaskListener`,可在流程执行的关键节点执行自定义逻辑。 - 可通过监听器实现日志记录、业务逻辑集成、异常处理等功能。 7. ** Activiti 的扩展性** ...
3. **ExecutionListener** 和 **JobListener**:监听器,提供任务执行前后的回调功能,可以用来记录日志、监控状态等。 Elastic-Job-Lite 3.0.0.M1-SNAPSHOT是该框架的一个里程碑版本,其中可能包含了以下改进和新...
你可以自定义监听器类,通过实现`ExecutionListener`、`TaskListener`接口,然后在流程定义中配置它们。 7. **服务调用和服务任务** 在流程中,经常需要调用外部服务。这可以通过定义服务任务并绑定Java类来实现。...
1. 可以通过实现Activiti的TaskListener接口,自定义任务监听器,监听特定的任务事件。 2. 通过实现ExecutionListener或ActivityBehavior,可以监听流程实例的执行事件,实现业务逻辑的定制。 九、页面展示与交互 1...
Activiti提供了丰富的事件监听机制,开发者可以通过实现不同的监听器接口,如`TaskListener`和`ExecutionListener`,并在Spring配置文件中声明,实现在流程执行过程中的自定义逻辑。 7. **服务调用与业务集成**: ...
开发者可以通过实现 `ExecutionListener` 或 `TaskListener` 接口来编写自定义监听器。 8. **表单和用户界面(Forms and User Interfaces)**:为了与用户交互,流程中的任务通常关联有表单。Activiti 支持与外部...