Service Task、任务监听器和执行监听器都可执行调用Java 业务代码。
参考资料:
http://camunda-cn.shaochenfeng.com/user-guide/process-engine/delegation-code/
服务任务 Class 配置的类,必须实现接口
org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior; 功能大于JavaDelegate,用不好会出问题,小心使用。
或
org.camunda.bpm.engine.delegate.JavaDelegate;推荐使用。
public class MonitorJavaDelegate implements JavaDelegate {
@Override
public void execute(DelegateExecution execution) throws Exception {
String processInstanceId = execution.getProcessInstanceId();
}
}
public class MonitorActivityBehavior implements ActivityBehavior {
@Override
public void execute(ActivityExecution execution) throws Exception {
String processInstanceId = execution.getProcessInstanceId();
}
}
执行EL表达式 ,可直接调用JavaBean 的方法
expression=“#{monitorExecution.execution(execution)}”
@Component("monitorExecution")
public class MonitorExecution {
public void execution(DelegateExecution execution){
String processInstanceId = execution.getProcessInstanceId();
}
}
基本使用和Expression 使用方式类似,支持EL表达式。
delegateExpression=“#{monitorExecution.execution(execution)}”
如果当前的Bean实现接口 ActivityBehavior 或 JavaDelegate 接口时,可直接配置Bean名称。
delegateExpression=“${monitorExecution}”
对于用户任务,可添加Task 监听器。
## Class
任务监听器(Task Listener) class 必须实现接口:
org.camunda.bpm.engine.delegate.TaskListener;
实现接口:并不能配置任务监听器类型;
org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior;
org.camunda.bpm.engine.delegate.JavaDelegate;
public class MonitorClassTaskListener implements TaskListener {
@Override
public void notify(DelegateTask delegateTask) {
String processInstanceId = delegateTask.getProcessInstanceId();
int priority = delegateTask.getPriority();
}
}
使用方式和服务任务的用法基本一样。
Delegate Expression 可以配置 delegateExpression=“${monitorUserTaskListener}”,这个Bean实现接口TaskListener
@Component("monitorUserTaskListener")
public class MonitorUserTaskListener {
public void monitor(DelegateTask task){
String processInstanceId = task.getProcessInstanceId();
int priority = task.getPriority();
}
}
执行监听器(Execution Listener) class 必须实现接口:
org.camunda.bpm.engine.delegate.JavaDelegate;或
org.camunda.bpm.engine.delegate.ExecutionListener;推荐使用
实现接口:
org.camunda.bpm.engine.impl.pvm.delegate.ActivityBehavior 并不能配置执行监听器类型;
public class MonitorExecutionListener implements ExecutionListener {
@Override
public void notify(DelegateExecution execution) throws Exception {
String processInstanceId = execution.getProcessInstanceId();
//执行监听器中可以获取Camunda其他服务,调用执行;
//无法获取Spring 管理的服务,需要通过静态类获取Spring上下文获取服务;
RuntimeService runtimeService = execution.getProcessEngine().getRuntimeService();
}
}
使用方式和服务任务的用法基本一样。
expression 可以配置:expression=“#{monitorExecution.execution(execution)}”
Delegate Expression 可以配置 delegateExpression=“${monitorExecution}”,这个Bean实现接口 ExecutionListener
@Component("monitorExecution")
public class MonitorExecution {
public void execution(DelegateExecution execution){
String processInstanceId = execution.getProcessInstanceId();
}
}
在配置服务任务、任务监听器或执行监听器的时候,如果配置 Expression 表达式时,可以直接把内置上下文变量传递到JavaBean实例对象方法中。
expression="#{monitorExecution.execution(execution)}"
这些变量如下所示:
可以向委托类的字段中注入数据。支持以下类型的注入
* 固定字符串值
* 表达式
1.只有任务监听器 或 执行监听器 配置的是Java Class 类型时,才能够属性值注入;
2.配置 Expression 或 Delegate Expression 不能够注入(Spring 单列Bean,会有问题);
3.类中定义的 属性类型必须是 org.camunda.bpm.engine.delegate.Expression
;
4.类中定义的属性类型名称 必须和流程中定义的属性名称一致;
5.字段或属性必须要有Setter 方法,经过测试,没有Setter也可以注入值;
@Data
public class MonitorExecutionListener implements ExecutionListener {
//这里定义的Expression 字段名称必须要和流程中 Field Injection 名称一致
private Expression myexe;
@Override
public void notify(DelegateExecution execution) throws Exception {
String myexe_val = (String) myexe.getValue(execution);
System.out.println("myexe_val = " + myexe_val);
String processInstanceId = execution.getProcessInstanceId();
//执行监听器中可以获取Camunda其他服务,调用执行;
//无法获取Spring 管理的服务,需要通过静态类获取Spring上下文获取服务;
RuntimeService runtimeService = execution.getProcessEngine().getRuntimeService();
}
}
属性注入类型可以是 Expression 表达式:
会获取流程中的 myurl 变量值,注入到监听器属性myurl 中。