`

jBPM学习笔记(更新中...)

    博客分类:
  • jBPM
阅读更多
[size=medium]★execution是一种类似有限状态机和UML状态图的东西, 用于在整个流程中流动, 将携带一些context信息, 比如当前节点.Transition通过使用take方法来将execution从一个节点传递到另一个节点.而当execution到达一个node之后, 将通过node的execute方法继续传递到下一个节点, 如果这个节点没有继续传递execution的话, 那么它将处于等待状态. 在开始节点将对新创建的execution进行初始化, 然后等待一个事件(或一个信号)来将其进行传递
★execution的传递过程是这样的:首先调用execution的event方法, 然后在event中找到leaving transition, 如果找到, 那么将通过调用transition的take方法将execution做为参数进行传递.到达一个node之后, 接着调用node的execute方法, 在execute中做相应的处理之后, 选择一个transition进入下一个node.
★action是用来在jbpm中插入业务逻辑的地方, 它一般都是跟一个event相关联, 最基本的event是node-leave和node-enter, 一般我们是在这里加入我们的业务逻辑
★可以将JbpmContext看成一个事务, 在流程运行过程中所需要的服务将包含在其中(这些服务在JbpmConfiguration中配置), 一般我们在执行完成之后将其关闭
★一般我们通过调用JbpmContext的loadXxxx方法取得的流程(任务)实例, 需要调用JbpmContext的save方法来做最后的保存, 但是如果是调用JbpmContext的xxxForUpdate方法来取得流程(任务)实例的话, 这不必调用jbpmContext.save方法, 这是因为xxxForUpdate方法将把这些实例添加到一个自动保存列表中, 这样在调用jbpmContext.close()方法的时候将自动被保存到数据库中.如loadProcessInstanceForUpdate方法:
public ProcessInstance loadProcessInstanceForUpdate(long processInstanceId) {
	ProcessInstance processInstance = getGraphSession().loadProcessInstance(processInstanceId);
	addAutoSaveProcessInstance(processInstance);
	return processInstance;
}

而在close的时候会调用autoSave方法, 其代码如下:
void autoSave() {
    if (autoSaveProcessInstances!=null) {
      Iterator iter = autoSaveProcessInstances.iterator();
      while (iter.hasNext()) {
        ProcessInstance processInstance = (ProcessInstance) iter.next();
        save(processInstance);
        iter.remove();
      }
    }
}

★在默认情况下, jbpm在第一次调用hibernate session的时候将开启一个事务, 在jbpmContext关闭的时候结束一个事务, 而结束一个事务是commit还是rollback取决于我们在关闭前是否调用了jbpmContext.setRollbackOnly()方法, 调用则rollback, 否则为commit.
★token表示exection的执行路径, 它是一个运行时概念, 其内部维护了一个对当前节点的引用, 当流程实例创建之后, taoken(这里它被成为rootToken)也相应的被创建
★图形化的流程做为一种需求沟通手段非常直观, 而所有的底层细节则需要通过action来实现, 它也是用来实现业务逻辑的地方
★流程中的所有节点不外乎有两种职责:执行指定的java代码, 传递execution
★decision node有两种判断方式, 一种是定义在流程定义文件中, 一种是通过插入的handler java代码来做判断. 在配置文件中的判断做法是在transition中添加condition元素, 然后在condition中通过使用el表达式或者beanshell脚本来作判断返回的boolean值. 在运行的时候遍历所有的transition的condition, 当碰到第一个transition中的condition返回true则将从该路径离开当前节点, 如果都为false, 那么将从默认的transition离开当前节点.还有一种方法就是通过decision的expression属性的返回结果来指定从哪个transition离开.
★一种替代decision node的方案, 如果需要在流程外部来做判断, 那么为还可以通过state节点来处理, 首先让exection进入state节点, 这样整个流程将处于等待状态, 然后在流程外部做完处理之后, 通过调用token.signal(xxx)或者taskInstance.signal(xxx)来让流程继续执行.
★使用普通node来模拟decision node, 这里涉及到定制node的用法, 其实也很简单, 就是在actionhandler实现类中除了处理逻辑之外, 还需要做的一件事就是传播execution. 比如类似这样的做法:
public class AmountUpdate implements ActionHandler {
  public void execute(ExecutionContext ctx) throws Exception {
    // business logic
    Float erpAmount = ...get amount from erp-system...;
    Float processAmount = (Float) ctx.getContextInstance().getVariable("amount");
    float result = erpAmount.floatValue() + processAmount.floatValue();
    ...update erp-system with the result...;
    
    // graph execution propagation
    if (result > 5000) {
      ctx.leaveNode(ctx, "big amounts");
    } else {
      ctx.leaveNode(ctx, "small amounts");
    }
  }
}

同样我们还可以定义自己的fork和join节点
★Superstate是用来对node进行分组的. 而且可以被嵌套使用, 一般在复杂的流程设计中会使用到(比如流程中的node有一定的层次关系), 其好处能对进入Superstate中的任意的一个node进行统一的控制(通过独有的两个事件superstate-enter and superstate-leave), 对于到达内部node的transition写法也引入了用于表示层次关系的"/"(下级node)和".."(上级node)
★在将任务分配给具体的执行人(actor)时, 可以针对某一个taskInstance写一个AssignmentHandler, 将taskInstance的actorId设置为执行人, 如果多个taskInstance都是同一个执行者的话, 那么可以考虑swimlane, swimlane相当于权限管理中的角色, 先将taskInstance跟swimlane绑定, 然后将actor跟swinlane绑定.
★除了可以将taskInstance跟一个人绑定之外(也就是所谓的push模式), 还可以同时跟多个人绑定(也就是所谓的pull模式), 然后由这些人自己来决定谁来负责处理该taskInstance.因此我们可以得出结论一个taskInstance只能由一个人来处理
★...

jbpm表结构说明
jbpm_variableaccess中存放的是子processstate节点中定义的变量引用设置
jbpm_node则是所有流程的所有节点
...
[/size]
2
1
分享到:
评论
4 楼 macrochen 2008-07-22  
引用
不知道JBPM的流程上下文是怎么做的处理?我对Shark引擎比较熟悉,在新建一个活动节点时,引擎就将流程的上下文拷贝一份给活动节点,在这个活动节点结束时就将自己的上下文与流程的上下文做一下同步

jbpm是通过token来处理上下文的, 它不会copy上一个流程的上下文, 只是会在流程中传递一个叫execution的东东, 它里面保存了一些上下文信息.同时jbpm还有一个jbpmcontext,它通过各种服务来完成对流程的控制
3 楼 macrochen 2008-07-22  
引用
楼主有没有对pvm做过研究?

还没呢
2 楼 netlynx206 2008-07-18  
不知道JBPM的流程上下文是怎么做的处理?我对Shark引擎比较熟悉,在新建一个活动节点时,引擎就将流程的上下文拷贝一份给活动节点,在这个活动节点结束时就将自己的上下文与流程的上下文做一下同步
1 楼 yuanqixun 2008-07-18  
楼主有没有对pvm做过研究?

相关推荐

Global site tag (gtag.js) - Google Analytics