学习Jbmp笔记

 InputStream is = java.util.Date.class.getResourceAsStream("Collection.class");

  

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 当流程开始的时候,创建流程常量。
  

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

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

    TaskInstance ti = pi.getTaskMgmtInstance().getInstance().iterator().next();
    ti.end("部门经理审批通过");

     如果如果点击不通过。
  

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

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

  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最后必须调用

  /*
   * 这句别漏了,否则流程不会向下走哒
   */
  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.           
可以用

 InputStream is = java.util.Date.class.getResourceAsStream("Collection.class");

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值