jbpm核心类使用

Jbpm的使用步骤
A)编写流程定义(定义规则);
B)部署流程定义到系统中;
C)执行流程(使用指定的流程定义);
          使用jBPM提供的JPDL(jBPM Process Definition Language)来描述流程,jPDL是一种直观的流程语言,可以使用任务、等待状态、定时器、自动化动作等等图形化地表示流程。jPDL认为一个商务流程可以被看作是一个UML状态图。

     流程定义:预先定义的业务流转逻辑。
     流程实例(process instance):业务的一次实际流转过程。(是流程定义执行期间的体现,包含了流程定义被解释之后的一些信息,诸如开始时间、结束时间和其他相关联的信息)。
    任务实例(task instance): 组成流程实例的元素。(Task被解释执行时的信息,有开始时间、结束时间、参与者等,有create、start、end 三种状态)。

     Jbpm的API流程有关的所有信息都是要保存到数据库中的。jBPM的其中一个特色就是它使用Hibernate来管理它的数据库。这样,jBPM就将数据的管理职能分离出去,自己则
专注于商务逻辑的处理。

        流程中一个比较重要的概念就是令牌(Token),流程实例通过Token的维护当前正在执行的节点 。Jbpm是通过Token知道一个流程实例现在走到哪个节点,每个流程实例都是一个指针,指向当前正在执行的节点,在当前节点执行完后,到达了下一个节点,就是让这个指针指向下一个节点。这个指针叫做Token(也叫做令牌)。Token是运行时的概念,用来维护指向图结点的指针。Token需要一个信号(signal)来让流程向前执行。当一个signal来到的时候,Token就会通过transition离开当前的结点走到下一个结点。

 

jbpm中要用的jar包,把它们添加进入项目
 
   jbpm-jpdl.jar(核心);
   jbpm-identity.jar(可选,组织机构);
   bsh.jar(BeanShell脚本);
   jboss-j2ee.jar;

   hibernate3.jar(Hibernate);
   antlr-2.7.6.jar(Hibernate);
   asm.jar(Hibernate);
   cglib.jar(Hibernate);
   dom4j.jar(Hibernate);
   commons-collections.jar(Hibernate);
   commons-logging.jar(Hibernate);

   hsqldb.jar(可选,纯Java写的数据库);
   log4j.jar(可选,日志记录);

   Junit4(单元测试);

     添加配置文件(在jbpm-jpdl-3.2.2/config目录中):
   jbpm.cfg.xml;
   hibernate.cfg.xml;
   log4j.properties(可选,log4j配置文件);
修改数据库库连接信息,如果使用的不是HsqlDB数据库,还应添加相应的jdbc驱动。

  生成数据库表。

 编写流程步骤,要实现的功能有:
    a> 部署流程定义。
    b> 启动流程。
    c> 获取任务列表。
    d> 开始任务。
    e> 结束任务。
其中编写流程定义和步骤a是添加流程定义到系统中;步骤b,c,d,e是使用系统中
存在的某个流程定义执行流程;步骤c,d,e是办理一个任务的过程,流程的执行就
是一次次办理任务的过程。

         有两个重要的类:JbpmConfiguration和JbpmContext。

JbpmConfiguration是jBPM的相关配置信息,并有创建JbpmContext的功能,可以把JbpmConfiguration想像成Hibernate中的Configuration与SessionFactory的结合体。使用
JbpmConfiguration.getInstance()方法创建一个JbpmConfiguration对象,这会使用默认的jbpm配置文件:在classpath根目录中,并且名字为jbpm.cfg.xml。

         JbpmConfiguration jbpmConfiguration = JbpmConfiguration.getInstance();这个是单实例

或者是使用getInstance(String configFilePath)方法,用指定的配置文件构造。

         Jbpm中几乎所有的操作都是通过JbpmContext完成的,可以把他想像成Hibernate中的Session。他是通过JbpmConfiguration.createJbpmContext()方法创建的,

        JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();

JbpmContext中包装有一个Hibernate的Session(通过他做的数据库操作)。使用完JbpmContext后一定要调用他的close()方法,否则所有信息都不会持久化到数
据库当中。

         jbpmContext.close(); // 提交/回滚 事务,关闭Session

因为在调用JbpmConfiguration.createJbpmContext()方法时会创建一个Hibernate的Session并开始事务;在调用JbpmContext.close()方法时会提交事务并且关闭所关联的Session。如果在执行JbpmContext.close()之前调用方法jbpmContext.setRollbackOnly(),则在JbpmContext.close()时会回滚事务。

         jbpmContext.setRollbackOnly();

这个是在部署流程定义失败的时候,进行回滚.这句话的功能不是直接进行回滚,而是做个回滚标记.在关闭的时候做回滚.

 

部署流程定义:这个过程就是把流程定义的相关信息保存到jBPM的数据库中。

          解析流程定义有三种方式,所使用的方法都在ProcessDefinition中,并且都是static的:

1)parseXmlResource方法,parseXmlInputStream方法和parseXmlReader方法,是解析一个xml的流程定义文件;

2)parseXmlString,是解析一个字符串;

3)parseParResource与parseParZipInputStream是解析一个par包。

        // pd = ProcessDefinition.parseParResource("helloworld/helloworld.zip");

        jbpmContext.deployProcessDefinition(pd);

部署流程定义时,如果存在同名的流程定义,则版本自动累加(加1);如果不存在,则版本为1。

执行流程
         流程实例可以通过ProcessDefinition.createProcessInstance()方法创建,或者是使用new ProcessInstance(ProcessDefinition pd)并传递一个流程定义来创建,总之创建的流程实例一定是要是属于(使用)某个流程定义的。启动流程后不要忘了使用ProcessInstance.signal()方法离开开始状态。

             ProcessDefinition pd = jbpmContext.getGraphSession().findLatestProcessDefinition("helloworld");
             ProcessInstance pi = pd.createProcessInstance();
这里是不用手动保存的,jbpm会自动执行这个操作.
             jbpmContext.save(pi);
创建一个流程实例
            pi.getRootToken().signal();
关闭打开的资源.Java会自动回收没有引用的对象,但不会回收没有关闭的资源.
            jbpmContext.close();

注意:流程定义的名字是processdefinition.xml文件中的根元素的name属性的值,不是流程定义文件的名字!每个节点都有多个任务,任务列表:当前需要办理(未完成)的任务集合。可以通过TaskMgmtSession获得。开始任务的方法为:TaskInstance.start();结束任务为:TaskInstance.end(),

开始任务
            TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
            ti.start();
结束任务
           TaskInstance ti = jbpmContext.getTaskInstance(taskInstanceId);
           ti.end();

一个任务实例只能开始和结束一次(再次开始或结束会抛异常,打印这个任务已经结束了)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值