JBPM学习笔记

学习JBPM应用已经快满一月了。发现在自己非常健忘,所以决定把自己在学习过程中的想法记下来,免得五一七天假期忘记得七七八八。在这里发第一篇BLOG,希望能有JBPM网友门发表不见的建解。

本人没有对笔记进行整理,以FQA的形式记下。



JBPM.jar 实际做了什么?

  图及其执行的描述 + 持久化   (通过类对象来实现图及图的执行,及提求这些对象的持久化服务)。
  图对象      : Node, Transiton, ProceesDefinition 等。
  图执行对象  : ProcessInstance, Token, ExecutionContext 等
  jbpm提求服务    : persistence,message,scheduler,logging,authentication

JBPM是什么?

  JBPM实际上是一个能够记录图执行状态的状态机,或者是实现状态机功能的工具包。
  Token是状态机的一个状态指针。在图的一次执行中,他指向这个图的一个结点, 这个结点表示这次执行的状态。
  Token的当前结点指针,会随着这次执行的继续而改变(从一个结点指向下一个结点直到结束,相当于状态机的状态转移直到结束状态) 。

  JBPM的输入: signal(包括: signal, end, scheduler服务周期的调度引发Timer.execute 等等)

JBPM如何用OO来表示图及其执行?

   图的两个基本元素: 结点(状态) 和 弧 分别用 Node, Transition 对象表示.
   图的执行:   执行和执行状态记录用  Execution 对象表示.
   图的行为:   结点(状态) 的行为用  Action 对象表示.

   理解JBPM关健是理解GOP。
JBPM的实现方式:解释执行

   应用GOP模式把图解释成类对象,并以图的执行方式执行。相对硬编码实现方式。


JBPM的持久化服务是什么?

   JBPM的持久化服务提供对图和执行状态对象的持久.
   具体为: 对 ProcessDefinition Node Transiition, Toke, ProcessInstance, ExecutionContext 等对象进行持久.其持久化技术: Hibernate. 

JBPM的scheduler服务是什么?
   执行JBPM的活动调度工能.
   具体为: scheduler 启动一线程(schedulerThread),过定时(5000)从数据库中把到期的持久化对象(Timer)取出,并执行Timer.execute();

JBPM的ProcessDefinition对象是什么?

JBPM的ProcessDefinition对象是就是一个图。他拥有图对象元素。
   JBPM中 jpdlXmlreader 把 processdefinition.xml 解释为 ProcessDefinition对象。
 
ProcessDefinition {
  protected int version = -1;   版本号
  protected boolean isTerminationImplicit = false;
  protected StartState startState = null; 开始状态结点;
  protected List nodes = null;   结点列表;
  transient Map nodesMap = null; 结点地图;
  protected Map actions = null;  行为;
  protected Map definitions = null;  
   }

把一个process archive deploy 到JBPM 过程中,JBPM做了些什么?

     1 解压 process archive   通过 java.util.zip.ZipInputStream
     2 提取 processdefinition.xml 和 相关类 通过org.jbpm.jpdl.par.ProcessArchive .
     3 解释 processdefinition.xml 为 ProcessDefinition 对象 通过 org.jbpm.jpdl.xml.JpdlXmlReader
     4 调用JBPM持久化服务 把ProcessDefinition 持久化到数据库 通过 org.jbpm.JbpmContext

如何生成或者修改ProcessDefinition对象?

例子:从数据库中查找一个ProcessDefinition 然后插入一个"SS"结点,最后持久化到数据库中

   1 数据原来deploy了一个"Hello World" ProcessDefinition   图示为  |  start -> s -> end |
    2从数据库中提取"Hello World"最新版本的的ProcessDefinition,在"s"结点和"end"之间插入"ss"结点
    最后持久化到数据库. 图示为  |  start -> s -> ss -> end |
代码:

      JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
        try {

          GraphSession graphSession = jbpmContext.getGraphSession();//得到一个GraphSession
         
          ProcessDefinition processDefinition =
              graphSession.findLatestProcessDefinition("Hello World");//得到一个ProcessDefinition;
         
          Node snode = processDefinition.getNode("s");          //从processDefinition中得到指向结点"s"的引用 ;
          Node endnode = processDefinition.getNode("end");   //从processDefinition中得到指向结点"end"的引用 ;
          Node node = new Node("ss");                           //生成一个"ss"结点;
          Transition stoend = snode.getLeavingTransition("toend");//从"s"结点中得到LeavingTransition "toend"的引用;
          Transition toend = new Transition();                  //生成一个toend 的Transition;
         
          stoend.setTo(node);                  //让原来从"s"指向"end"的Transition 指向 "ss"结点
       toend.setTo(endnode);                //让新Transition 指向 "ss"结点;
                node.addLeavingTransition(toend);   //把toend Transition 加入到"ss"的离开Transition中
          node.addArrivingTransition(stoend);  //把stoend 原来s指向end 加入到"ss"进入Transition中
          endnode.addArrivingTransition(toend); //
          processDefinition.addNode(node);   //把新结点"ss"加入到ProcessDefinition中

        } finally {
           
            jbpmContext.close();//关闭jbpmContext,把processDefinition 更新到数据库。
        }
 ///
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值