jbpm工作流程

1 ?JBPM的子流程是怎么工作的?

没有做

2 B2C也是担保交易,支付宝压款是完全可以接受的。

3 在退款协议期可能会有死循环,所以要介入人工处理阶段。人工处理应该是数据库定时JOB,将超时的任务导出到到后台小二的job list,子流程处理也要返回两个结果,退或不退,来判断是否退款是否结束

4 JBPM的任务节点(task-node)
任务节点是一个需要人工参与的节点,当流程进入节点,会生成相应的任务实例(task instance),并通过实现某个委派接口AssignHandler或jBPM表达式将任务委派给参与者,在界面上,需要根据参与者角色生成某个按钮,参与者按了后,节点才会进入下一个流程。节点进入等待状态,知道任务被参与者完成或跳过,过程才会继续。
判定节点(decision)
判定节点的设计目标是根据上下文环境和程序逻辑来判定流程转向。通过指定的DecisionHandler接口的实现类或jBPM表达式,返回transition字符串名称。来决定流程的方向。
普通节点(node)
普通节点也可以处理定义的相应的处理任务,通过实现的ActionHandler的类。同任务节点不同的是,普通节点定义的任务是自动执行的,而不需要人工来点,比如通知消息。
?可以定义成一个Node节点,在时间发生后,发Email或wangwang消息。或退款成功,通知支付宝按退款协议给双方打款,也可以做成一个Node节点。
5?Node,TaskNode,Decision上都可以挂接EventNode,
三种结点都可定义结点事件(event):?
?node-enter,该事件在流程进入结点时触发?
?node-leave,该事件在流程离开节点是触发?
?可以在事件上挂接ActioinHandler接口的实现类来完成一些特定的功能。?
?在EventNode中,写ActionHandler的实现类,从而自动完成一些任务,比如发邮件等任务。


6?NodeTask的具体定义,几个参数是什么意思??
比如General,Detail,Assignment,Controller,Reminder分别代表什么意思。

?

7 JPML中最常用的几个程序回调接口
动作处理接口ActionHandler,在需要evnet,antion的地方回调
interface ActionHandler{
??? void execute(ExecutionContext executionContext) throws Exception;
}
该接口通过执行上下文ExecutionContext来了解当前的状态,比如节点处的位置,买卖双方的信息等。

判定接口(DecisionHandler)
public interface DecisionHandler extends Serializable {
? String decide(ExecutionContext executionContext) throws Exception;
}
会返回一个字符串,在这个节点,根据字符串,决定往哪个transision分支走。

委派处理接口(AssignmentHandler)

接口方法:void assign(Assignable assignable, ExecutionContext executionContext) throws Exception;

适用于TaskNode中新增的Task节点,对应的是Assignment的Tab,他的作用是将Task委派给指定的人员或角色。

委派处理接口被用户任务元素(task)的委派(assignment)子元素中,它的职责很明确,就是将任务分配给指定的人员或角色。
?在AssignmentHandler接口的方法中,Assignable变量通常指任务实例(TaskInstance)。通过将ExecutionContext和TaskInstance两个变量都暴露给接口方法,用户就可以根据流程上下文情况,来决定要将指定的任务分配个谁。

作用于Node和作用于transision的handler虽然都是继承自同一个接口ActionHandler,但是Node的execute的方法内,必须执行executionContext.leaveNode来保证流程的向下执行,而transition不用使用这个方法。

8?一个TradeProcessConstans类,来包装所有字符串常量。

我们对Jbpm的封装

9?当流程开始的时候,创建流程常量。
??

Java代码 复制代码
  1. protected ? void ?createProcessInstance(String?user){ ??
  2. ?????? //生成实例 ??
  3. ???pi?=?pdf.createProcessInstance(); ??
  4. ??? //设置流程发起人 ??
  5. ???pi.getContextInstance().createVariable( "initiator" ,?user); ??
  6. ??? //触发流程转向 ??
  7. ???pi.signal();? //进入流程的第一个节点,会触发第一个Transision。 ??
  8. ??????????????????? //新建一个ProcessInstance,会自动触发这步,但是,因为系统升级的过程中,有的流程是正在退款的过程中,所以,对这种流程要判断,并且要赋给它一个初始的状态。 ??
  9. ??}??
  protected void createProcessInstance(String user){

        //生成实例

     pi = pdf.createProcessInstance();

     //设置流程发起人

     pi.getContextInstance().createVariable("initiator", user);

     //触发流程转向

     pi.signal(); //进入流程的第一个节点,会触发第一个Transision。

                     //新建一个ProcessInstance,会自动触发这步,但是,因为系统升级的过程中,有的流程是正在退款的过程中,所以,对这种流程要判断,并且要赋给它一个初始的状态。

    }

?
??? 当用户提交借款申请。
??? 当经理审批通过,是经理在界面点击通过或不通过的按钮,业务层调用:

Java代码 复制代码
  1. TaskInstance?ti?=?pi.getTaskMgmtInstance().getInstance().iterator().next(); ??
  2. ti.end( "部门经理审批通过" );??
    TaskInstance ti = pi.getTaskMgmtInstance().getInstance().iterator().next();

    ti.end("部门经理审批通过");

???? 如果如果点击不通过。
??

Java代码 复制代码
  1. ti.end( "部门经理审批不通过" );??
  ti.end("部门经理审批不通过");

???? 打印出TaskInstance所有的向下的支路.

Java代码 复制代码
  1. List<transistion>?transitions?=?ti.getToken.getNode().getLeavingTransitions(); ??
  2. ?? for (Transition?t?:?transitions){ ??
  3. ??????sysout(t.getName()); ??
  4. ??}??
  List<transistion> transitions = ti.getToken.getNode().getLeavingTransitions();

    for(Transition t : transitions){

        sysout(t.getName());

    }

???? 进入TaskNode节点,会自动回调TaskNode的Task节点的AssignHandler和ControllerHandler,决定流程如何向下一个节点流转。??
?
10 executionContext.getContextInstance.getVarable();
可以把OrderID或外部ID,用户ID等放到varable中去,并持久化到数据库。

11 超时是应用层考虑还是数据库层考虑,这里放到一边。
设计的结果是应用层考虑超时。

12?借款的流程顺序。

第一个Transision,StartProcessActionHander
第二个回调:在提交支款申请里面,DepartmentManagerHandler
第三个回调:AssignmentHandler,进入部门经理审批流程,将这个审批任务分配给一个或一群人。调用这个Handler来调用:DepartmentManagerApproveAssignmentHandler来进行分配。
第4个回掉:ActionHandler的回调,在审批同意的Transition里回调
ManagerApprovedAction
第5个回调,在部门经理审批同意后,看金额是否大于6000,决定是否上调给总经理审批。
如果小于5000,自动执行小于5000的Transition,在DecideNode,不需要等待,直接执行。执行"<5000 财务拨款"Transition,进入下一个Node"财务拨款"。

问题,在这个过程中,如果保证事务,如果一个节点失败了,是否要进行回滚,和如何进行回滚,JBPM有机制来保证这个过程吗?

第6个回调,流转到"财务拨款",财务拨款是个Node,系统自动调用,而不需要人工参与。
Node和TaskNode中的Action不同的是,NodeAction的execute最后必须调用

Java代码 复制代码
  1. /* ?
  2. ?*?这句别漏了,否则流程不会向下走哒 ?
  3. ?*/ ??
  4. executionContext.leaveNode();??
  /*

   * 这句别漏了,否则流程不会向下走哒

   */

  executionContext.leaveNode();

?不然,流程不会向走。
第7个回调,Trasition流转到邮件通知这步,流转调用SendMailActionHandler,,其实邮件通知可以在BenforeNode和LeaveNode里面用Event来做,也是一种方法。

?

13?ProcessDefinition
?? --ProcessInstance
?? ----TaskInstance
?? ------Token
?? --------Node
?? ----------Transition

?

14?JbpmContext的用处。

?

15?怎么在Jbpm中使用单元测试。

?

?

?

16??怎么在mysql指定的数据库上创建一个用户名密码,并且把所有或部分的权限赋给他。

?

17?部署Jbpm

调用ProcessDefinition,将其在内存中生成,并部署到MySql中去。

????????????????????????????????????????????????????

18?class.getResourceAsStream 是以当前目录为基础,得到InputStream. ???????????
可以用

Java代码 复制代码
  1. InputStream?is?=?java.util.Date. class .getResourceAsStream( "Collection.class" );??
 InputStream is = java.util.Date.class.getResourceAsStream("Collection.class");

?得到了InputStream就可以用ClassLoad将类重新载入内存了。

19 怎么得到ClassPath的路径,实际上,需要的是类路径上的配置文件。

Java代码 复制代码
  1. Class.getResourceAsStream( "/log4j.properties" ); ??
  2. Class.getClassLoader.getResourceAsStream( "log4j.properties" );??
Class.getResourceAsStream("/log4j.properties");

Class.getClassLoader.getResourceAsStream("log4j.properties");

20 使用EmEditor的技巧。
怎么在每一行某位加一个";",比如在数据库脚本?
查找(^[^--]*$)? 表示所有不以--开头的行,用()将他们括起来,是为了back reference(向后引用),将他们替换成\0;表示将前面查到的所有都替换,并且在末尾加一个;
怎么删除空行?
查找^[ \t]*$\r\n,并将他们替换为空.

你可能感兴趣的:(mysql,工作,log4j,jbpm,单元测试)