今天看jbpm文档的时候,看了下jbpm4.4的整体架构,看完之后也顺势debug了下jbpm的源代码,从源代码中小小体会了下jbpm的设计思想
先看下jbpm的整体架构,如下图
再看下jbpm在一个流程中的执行过程
从第一副图中可以看出,在jbpm中,它的一切都基于服务,只要你启动完成流程引擎之后。你便可以获取到它为你提供的各种服务,如上图所示的几大服务,processservice,executionservice,managerservice,commondservice,还有像historyservice,taskservice,repstorysrvice等,其中CommondService是核心,其实其他
服务最终都通过commondservice实现对客户请求的应答
而图二我们可以看出,流程是通过一个execution实时跟踪,以判断当前节点是什么节点,当前节点是否有任务人,执行任务的是什么人,执行完成后
流程的走向是怎样,底层最终操作是通过数据库进行的。
今天主要体会了下jbpm的命令者设计模式,故自己举了个实例debug下,从中获取了些jbpm实现思想
(这个实例就是通过taskservice通过taskid获取task过程)
首先我们获取TaskService服务,其实它的本质是TaskServiceImpl的一个对象,它和TaskService关系下面图有描述,然后调用该服务的getTask(String taskId)方法
先看下TaskServiceImp里面的该方法的实现
public Task getTask(String taskId)
{
return commondService.execute(new GetTaskCmd());
}
其中GetTaskCmd实际上就是一个具体的命令对象,它和jbpm里面的commond关系如下图所示
而getTask(String taskId)方法里面的commondService其实是个命令服务接口,通过它可以执行所有的命令请求,在执行最终的GetTaskCmd真实命令对象之前,一般都会先执行SkipInterceptor,然后RetryInterceptor,EnvironmentInterceptor,(这三个interceptor其实就是上图系统架构里面看到的拦截器链).最终调用具体的命令对象,在GetTaskCmd中它覆盖commond<T>的execute方法如下
public class GetTaskCmd extends AbstructCommand<Task>
{
......................
public Task execute(Environment environment) throws Exception
{
//通过系统环境拿到数据库操作的session
Dbsession sbsession=environment.get(DbSession.class);
//通过hibernate反射封装生成一个TaskImpl对象返回客户
return dbSession.get(TaskImpl.class,Long.parseLong(taskId));
}
}
最终通过GetTaskCmd 具体对象的execute方法,返回用户想要获取的TaskImpl对象