jbpm4.4 命令者模式笔记

今天看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对象

猜你喜欢

转载自javapolo.iteye.com/blog/1295793