Activiti 引擎事件监听模型代码走读
来源:互联网 发布:袖珍三公主淘宝 编辑:程序博客网 时间:2024/06/02 22:00
一、ActivitiEventDispatcher发布事件
ProcessEngineConfigurationImpl 持有ActivitiEventDispatcher引用,成员属性名为eventDispatcher。
CommandContext为线程级的,CommandContext又持有ProcessEngineConfigurationImpl 引用。
->CommandContext可通过ProcessEngineConfigurationImpl 获取ActivitiEventDispatcher
例子:
TaskEntity.insert中会发布一个事件,代码如下:
commandContext.getProcessEngineConfiguration().getEventDispatcher().dispatchEvent(
ActivitiEventBuilder.createEntityEvent(ActivitiEventType.ENTITY_CREATED, this));
其中TaskEntity.insert的被调用过程为:
UserTaskActivityBehavior.execute->TaskEntity.createAndInsert(execution)->TaskEntity.insert
二、ActivitiEventDispatcherImpl的实现
1、ActivitiEventDispatcherImpl的具体实现实在其成员属性ActivitiEventSupport中定义。
2、ActivitiEventSupport实例内部维护了一个监听器集合成员属性和一个键值对集合:protected List<ActivitiEventListener> eventListeners;protected Map<ActivitiEventType, List<ActivitiEventListener>> typedListeners;
添加删除监听器都是操作这两个集合。
3、发布事件通过ActivitiEventSupport.dispatchEvent,该方法会调用两个集合中事件相关的监听器的onEvent(event)方法,
三、监听器注册
ActivitiEventDispatcherImpl.addEventListener
四、新建一个task在工作流引擎中的调用堆栈
TaskEventsTest
新建一个task在工作流引擎中的调用堆栈
TaskEntity.create(Date) line: 166
NewTaskCmd.execute(CommandContext) line: 38
NewTaskCmd.execute(CommandContext) line: 1
CommandInvoker.execute(CommandConfig, Command<T>) line: 24
CommandContextInterceptor.execute(CommandConfig, Command<T>) line: 57
LogInterceptor.execute(CommandConfig, Command<T>) line: 37
CommandExecutorImpl.execute(CommandConfig, Command<T>) line: 40
CommandExecutorImpl.execute(Command<T>) line: 35
TaskServiceImpl.newTask(String) line: 80
TaskServiceImpl.newTask() line: 76
五、包路径
org.activiti.engine.delegate.event.ActivitiEventDispatcher
org.activiti.engine.delegate.event.ActivitiEvent
org.activiti.engine.delegate.event.ActivitiEventListener
org.activiti.engine.delegate.ExecutionListener
org.activiti.engine.delegate.JavaDelegate
六、ExecutionListener
如:TransitionImpl实例持有ExecutionListener的集合
public class TransitionImpl extends ProcessElementImpl implements PvmTransition {
protected List<ExecutionListener> executionListeners;
AtomicOperationTransitionNotifyListenerTake.execute方法会调用ExecutionListener.notify(execution)方法。
DefaultListenerFactory
org.activiti.engine.impl.bpmn.parser.factory. DefaultListenerFactory
ProcessEngineConfigurationImpl持有ListenerFactory引用
七、定义activiti流程节点
八、初始化一个activiti的UserTask逻辑节点
1、UserTaskParseHandler.executeParse中bpmnParse.getActivityBehaviorFactory().createUserTaskActivityBehavior(userTask, taskDefinition) 用来初始化一个UserTaskActivityBehavior对象
2、初始化一个activiti的UserTask逻辑节点的方法调用堆栈
DefaultActivityBehaviorFactory.createUserTaskActivityBehavior(UserTask, TaskDefinition) line: 125
UserTaskParseHandler.executeParse(BpmnParse, UserTask) line: 50
UserTaskParseHandler.executeParse(BpmnParse, BaseElement) line: 1
UserTaskParseHandler(AbstractBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 84
UserTaskParseHandler(AbstractFlowNodeBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 27
UserTaskParseHandler(AbstractActivityBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 36
BpmnParseHandlers.parseElement(BpmnParse, BaseElement) line: 73
BpmnParse.processFlowElements(Collection<FlowElement>) line: 428
ProcessParseHandler.transformProcess(BpmnParse, Process) line: 88
ProcessParseHandler.executeParse(BpmnParse, Process) line: 49
ProcessParseHandler.executeParse(BpmnParse, BaseElement) line: 1
ProcessParseHandler(AbstractBpmnParseHandler<T>).parse(BpmnParse, BaseElement) line: 84
BpmnParseHandlers.parseElement(BpmnParse, BaseElement) line: 73
BpmnParse.transformProcessDefinitions() line: 395
BpmnParse.execute() line: 231
BpmnDeployer.deploy(DeploymentEntity, Map<String,Object>) line: 107
DeploymentManager.deploy(DeploymentEntity, Map<String,Object>) line: 50
DeployCmd<T>.execute(CommandContext) line: 83
DeployCmd<T>.execute(CommandContext) line: 1
CommandInvoker.execute(CommandConfig, Command<T>) line: 24
CommandContextInterceptor.execute(CommandConfig, Command<T>) line: 57
LogInterceptor.execute(CommandConfig, Command<T>) line: 37
CommandExecutorImpl.execute(CommandConfig, Command<T>) line: 40
CommandExecutorImpl.execute(Command<T>) line: 35
RepositoryServiceImpl.deploy(DeploymentBuilderImpl) line: 78
DeploymentBuilderImpl.deploy() line: 156
UserTaskActivityBehavior.execute(ActivityExecution execution)的最后会调用
TaskEntity.fireEvent(TaskListener.EVENTNAME_CREATE)方法->
Context.getProcessEngineConfiguration()
.getDelegateInterceptor()
.handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask)this));
TaskEntity实例持有TaskDefinition引用,TaskDefinition引用持有TaskListener集合
十、引擎触发ExecutionListener监听的调用点
AbstractEventAtomicOperation.execute(InterpretableExecution execution)
List<ExecutionListener> exectionListeners = scope.getExecutionListeners(getEventName());
listener.notify(execution);
AtomicOperationTransitionNotifyListenerTake
List<ExecutionListener> executionListeners = transition.getExecutionListeners();
listener.notify(execution);
十一、引擎调用暴露给外部的客户代码的实现
Context.getProcessEngineConfiguration()
.getDelegateInterceptor()
.handleInvocation(new TaskListenerInvocation(taskListener, (DelegateTask)this));
DelegateInterceptor
* Interceptor responsible for handling calls to 'user code'. User code
* represents external Java code (e.g. services and listeners) invoked by
* activiti. The following is a list of classes that represent user code:
* <ul>
* <li>{@link org.activiti.engine.delegate.JavaDelegate}</li>
* <li>{@link org.activiti.engine.delegate.ExecutionListener}</li>
* <li>{@link org.activiti.engine.delegate.Expression}</li>
* <li>{@link org.activiti.engine.delegate.TaskListener}</li>
* </ul>
public interface DelegateInterceptor {
public void handleInvocation(DelegateInvocation invocation) throws Exception;
}
- Activiti 引擎事件监听模型代码走读
- activiti流程运行过程代码走读
- memcache代码走读:接入模型
- Activiti创建模型代码
- activiti 监听引擎启动和初始化
- Activiti 自定义事件监听和邮件通知
- 代码走读
- 大话Java事件监听模型
- Activiti监听
- activiti 动态配置 activiti 监听引擎启动和初始化(高级源码篇)
- js监听键盘事件代码
- 键盘事件监听演示代码
- 代码添加EventTrigger监听事件
- 事件模型兼容代码
- 代码走读常见问题解答
- 代码走读的意义
- python 文件代码走读。
- 走读printk代码
- jsp总结
- M台机器用来服务用户,我们把机器编号成0到M。每台机器有多个CPU核,我们把核编号为0到Cm
- Climbing Stairs
- Android中外部程序调用方法总结
- linux下安装Fbterm
- Activiti 引擎事件监听模型代码走读
- jsp链接数据库方法
- Ajax技术(7)--AJAX解析XML
- iOS设备框架
- C#中的Invoke
- ElasticSearch基础杂烩-配置-索引-优化
- 软考之进程,线程,管程比较
- uva 825(dp)
- 090001 梯度下降