任务节点完成的时候,需要一些复杂业务,(比如当前节点完成的时候,需要调用我们的jms消息系统发送消息)。
任务流转到当前的节点的时候,需要监控当前任务节点的一些信息或者其他的业务信息。
当前的任务节点分配处理人的时候,需要触发自定义的一些业务。
流程开始结束的时候,需要处理业务信息。
经过任务节点的出线,也就是连线的时候,需要触发自定义的业务。
源码中如下:
/** Callback interface to be notified of execution events like starting a process instance,
* ending an activity instance or taking a transition.
*
* @author Tom Baeyens
* @author Joram Barrez
*/
public interface ExecutionListener extends Serializable {
String EVENTNAME_START = "start";//作用在流程实例的开始事件
String EVENTNAME_END = "end";//作用在流程实例的结束事件
String EVENTNAME_TAKE = "take";//作用在流程实例的连线上
void notify(DelegateExecution execution) throws Exception;
}
流程定义文件:
定义在流程上的监听器
定义在任务节点上的监听
定义在流转连线上的监听器
/**
* 执行监听器可以在流程执行中发生特定的事件时,执行外部Java代码或计算表达式。可以被捕获的事件有
*
* >> 流程实例的start(启动)和end(结束)。
* >> take(进行)转移(transition)。(这里是指顺序流线 上监听事件只有take)
* >> 活动的start和end。
* >> 网关的start和end。
* >> 中间事件的start和end。
* >> 启动事件的end,和结束事件的start。
*
*/
public class SiteReportExecutionListener implements ExecutionListener {
private static final long serialVersionUID = 8282921521567009453L;
@Override
public void notify(DelegateExecution execution) throws Exception {
//【1】监听的时间
String eventName = execution.getEventName();//监听的事件名称
if(EVENTNAME_START.equals(eventName)){//start
}else if(EVENTNAME_END.equals(eventName)){//end
}else if(EVENTNAME_TAKE.equals(eventName)){//序流线 上监听事件只有take
}
//【2】流程定义 以及 当前活动节点
String currentExecutionId = execution.getId();//正在执行的流程对象的执行id
String currentActivityId = execution.getCurrentActivityId();//正在执行的流程对象的活动节点id 获取当前的.Activityid
String currentActivityName = execution.getCurrentActivityName();//正在执行的流程对象的活动节点名称
String processInstanceId = execution.getProcessInstanceId();//当前流程实例id
String processDefinitionId = execution.getProcessDefinitionId();//流程定义id
String parentExecutionId = execution.getParentId();//获取父id,并发的时候有用
String tenantId = execution.getTenantId();//获取TenantId 当有多个TenantId 有用
String businessKey = execution.getBusinessKey();//业务id已经废弃
String processBusinessKey = execution.getProcessBusinessKey();//业务id
/**
* 这个非常有用吧。当拿到EngineServices 对象所有的xxxService都可以拿到
*/
EngineServices engineServices = execution.getEngineServices();
TaskService taskService = engineServices.getTaskService();
RuntimeService runtimeService = engineServices.getRuntimeService();
//【3】流程变量的获取与设置,删除 增晒改查
execution.getVariable("");
execution.setVariable("","");
}
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.activiti.engine.delegate;
import org.activiti.engine.EngineServices;
/**
* Execution used in {@link JavaDelegate}s and {@link ExecutionListener}s.
*
* @author Tom Baeyens
*/
public interface DelegateExecution extends VariableScope {
/** Unique id of this path of execution that can be used as a handle to provide external signals back into the engine after wait states. */
String getId();
/** Reference to the overall process instance */
String getProcessInstanceId();
/** The {@link ExecutionListener#EVENTNAME_START event name} in case this execution is passed in for an {@link ExecutionListener} */
String getEventName();
/** The business key for this execution. Only returns a value if the delegate execution
* is a process instance.
*
* @deprecated use {@link #getProcessBusinessKey()} to get the business key for the process
* associated with this execution, regardless whether or not this execution is a
* process-instance.
*/
String getBusinessKey();
/**
* The business key for the process instance this execution is associated with.
*/
String getProcessBusinessKey();
/**
* The process definition key for the process instance this execution is associated with.
*/
String getProcessDefinitionId();
/**
* Gets the id of the parent of this execution. If null, the execution represents a process-instance.
*/
String getParentId();
/**
* Gets the id of the calling execution. If not null, the execution is part of a subprocess.
*/
String getSuperExecutionId();
/**
* Gets the id of the current activity.
*/
String getCurrentActivityId();
/**
* Gets the name of the current activity.
*/
String getCurrentActivityName();
/**
* Returns the tenant id, if any is set before on the process definition or process instance.
*/
String getTenantId();
/**
* All Activiti services can be accessed through this interface.
*/
EngineServices getEngineServices();
}
同5.2 activiti任务监听器TaskListener_青苔猿猿的博客-CSDN博客
同5.2 activiti任务监听器TaskListener_青苔猿猿的博客-CSDN博客
实现了接口JavaDelegate
package org.jeecg.modules.activiti.ext.listener;
import org.activiti.engine.EngineServices;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
import org.activiti.engine.delegate.JavaDelegate;
/**
* 委托类的实现方式
*
*/
public class SiteReportJavaDelegate implements JavaDelegate {
/**
* 自定义方法
*/
public void test1(){
System.out.println("coming_2");
}
@Override
public void execute(DelegateExecution execution) throws Exception {
//【1】监听的时间
String eventName = execution.getEventName();//监听的事件名称
if(ExecutionListener.EVENTNAME_START.equals(eventName)){//start
}else if(ExecutionListener.EVENTNAME_END.equals(eventName)){//end
}else if(ExecutionListener.EVENTNAME_TAKE.equals(eventName)){//序流线 上监听事件只有take
}
//【2】流程定义 以及 当前活动节点
String currentExecutionId = execution.getId();//正在执行的流程对象的执行id
String currentActivityId = execution.getCurrentActivityId();//正在执行的流程对象的活动节点id 获取当前的.Activityid
String currentActivityName = execution.getCurrentActivityName();//正在执行的流程对象的活动节点名称
String processInstanceId = execution.getProcessInstanceId();//当前流程实例id
String processDefinitionId = execution.getProcessDefinitionId();//流程定义id
String parentExecutionId = execution.getParentId();//获取父id,并发的时候有用
String tenantId = execution.getTenantId();//获取TenantId 当有多个TenantId 有用
String businessKey = execution.getBusinessKey();//业务id已经废弃
String processBusinessKey = execution.getProcessBusinessKey();//业务id
/**
* 这个非常有用吧。当拿到EngineServices 对象所有的xxxService都可以拿到
*/
EngineServices engineServices = execution.getEngineServices();
TaskService taskService = engineServices.getTaskService();
RuntimeService runtimeService = engineServices.getRuntimeService();
//【3】流程变量的获取与设置,删除 增晒改查
execution.getVariable("");
execution.setVariable("","");
}
}
表达式处:${siteReportJavaDelegate.test1()}会执行test1方法
委托表达式:${siteReportJavaDelegate} 直接执行execute方法。