JBMP使用(2)-我的学习心得

来源:互联网 发布:myeclipse 设置js编码 编辑:程序博客网 时间:2024/05/22 19:51

JBMP使用(2)

一、JBPM的事件(event)和行为(action)

我们可以在流程执行过程中执行自己的代码, 象触发器一样,在特定的时候触发.

触发点:1.流程转向的时候;2.流程节点中的某个事件发生的时候.

常用事件:

节点进入(node-enter)

节点离开 node-leave)、

流程启动(process-start)、

流程结束(process-end)、

任务创建(task-create)、

任务分派(task-assign)、

任务启动(task-start)等事件。

代码规范:自己的代码必须实现ActionHandler接口

流程中含有事件和Action发布后的数据变化:

二、JBPM的任务

task-node被归类为一个等待节点,是指在task-node中的task列表中的task没有全部执行完之前,它会一直等待。

Task可以在task-node节点下定义,也可以挂在process-definition节点下。最普遍的方式是在task-node节点下定义一个或多个任务。

默认情况下,流程在task-node节点会处于等待状态,直到所有的任务被执行完毕。Task的执行是按顺序执行的,任务都完成后,token仍然不会指向后面的节点;需要自己手动调用processInstance.signal()才会驱动流程到下面的节点。

Task 是是流程定义里的一部分,它决定了task instance的创建和分配

任务分配:当流程执行到某个Task的时候,引时流程引挚要调用相应的swimlaneassignment将当前的task分配(委派)给某个参与者,外部参与者可以是一个人也可以是某个系统等。

task-node的列子

<process-definition name='the baby process'>

<start-state>

<transition name='baby cries' to='t' />

</start-state>

<task-node name='t'>

<task name='change nappy'>

<assignment class='org.jbpm.examples.taskmgmt.NappyAssignmentHandler' />

</task>

<transition to='end' />

</task-node>

<end-state name='end' />

</process-definition>

三、任务分配

任务分配有三种方式,我们可以将任务分配给个人或是某个群组

对于个人用户:

1.自己的代码中加入如下语句:TaskInstance.setActorId(String id);

2.AssignmentHandler中加入assignable.setActorId(String id);

3.在流程定义中的任务定义中加入属性actor-id

取得某角色的任务列表只需要做:

TaskMgmtSession.findTaskInstances(String acotorId);

对于组用户:

1.自己的代码中加入如下语句:TaskInstance. setPooledActorIds(String[])

2.AssignmentHandler中加入assignable. setPooledActorIds(String[])

3.在流程定义中的任务定义中加入属性pooled-actor-ids

取得某的任务列表只需要做:

TaskMgmtSession.findPooledTaskInstances(String actorId)

TaskMgmtSession.findPooledTaskInstances(List actorIds)

 

通过任务管理,我们在开发流程的时候就可以在用户登陆的时候看到需要办理的任务,在你处理完任务后该任务就会从任务列表中删除,该特性在OA,电子政务等系统中使用非常广泛。

四、JBPM的任务管理

我们将带有任务,并且任务有分配给相应的用户或用户组后的流程发布到数据库后,数据库中表数据的变化:

任务表 dbo.JBPM_TASK(任务的静态定义)

任务实例表JBPM_TASKINSTANCE(任务执行实例,动态)

任务参与者dbo.JBPM_POOLEDACTOR

参与者与任务实例之间是多对多的关系中间表:JBPM_TASKACTORPOOL

五、一个稍微综合一点的例子

l      目标

l      对于一个流程如何发起一个任务

l      如何分配任务给某个参与者

l      如何查看某个参与者的任务

l      对于群组任务如何自己来处理(拉入自己来处理)

l      如何处理任务 结合自己的业务

l      通过任务实例获得任务实例变量的值( ti.getVariable() )

l      通过该值查询出业务数据,进行处理

实现核心代码如下,

1,加载jbpm所需的包

2,开始写流程事件与行为

<?xml version="1.0" encoding="UTF-8"?>

 

<process-definition  xmlns=""  name="ActionAndEvent">

 

 

    <start-state name="start-state1">

       <transition to="node1"></transition>

    </start-state>

 

 

    <node name="node1">

       <event type="node-enter"></event>

       <transition to="end-state1">

          

           <action class="Action.ActionSecond"></action>

       </transition>

    </node>

 

 

    <end-state name="end-state1"></end-state>

 

 

</process-definition>

 

3,建立App测试

测试核心代码如下

*/

    //取配置信息

    JbpmConfiguration config = JbpmConfiguration.getInstance();

    //取上下文信息

    JbpmContext context = config.createJbpmContext();

   

   

    public static void main(String[] args) throws FileNotFoundException {

       // TODO Auto-generated method stub

       //发布流程

       App pd = new App();

       //执行步骤一

       pd.DeployProcess();

       //pd.zhixing1();

       ////删除定义流程

       //pd.delete();

       //关闭流程

       pd.close();

      

    }

    public void DeployProcess() throws FileNotFoundException{

       //发布流程到数据库

       //定义流程

       InputStream is = new FileInputStream("src/baoxiao/processdefinition.xml");

       ProcessDefinition ps = ProcessDefinition.parseXmlInputStream(is);

       //发布流程

       context.deployProcessDefinition(ps);

    }

    public void close(){

       //保存发布的流程

       context.close();

      

    }

    //执行工作流,第一步

    public void zhixing1(){

       //定义流程,从数据库中查询出流程定义

       ProcessDefinition ps = context.getGraphSession().findLatestProcessDefinition("baoxiao");

       //创建流程实例

       ProcessInstance pis = new ProcessInstance(ps);

       //置入一些数据在流程的上下文中

       ContextInstance ci = pis.getContextInstance();

       ci.setVariable("putao", "葡萄美酒夜光杯");

       ci.setVariable("yuyin", "欲饮琵琶马上催");

       ci.setVariable("zuiwo", "醉卧沙场君莫笑");

       ci.setVariable("gulai", "古来征战几人回");

       //执行流程

       pis.signal();

       //保存数据

       context.save(pis);

    }

    //执行流程第二部

    public void zhixing2(){

       ProcessDefinition ps = context.getGraphSession().findLatestProcessDefinition("baoxiao");

       //根据流程ID获取流程,实例

       ProcessInstance pi = context.getProcessInstance(3);

       //执行流程

       pi.signal();

       //取出流程实例中的变量值

       ContextInstance ci = pi.getContextInstance();

       String a = (String) ci.getVariable("putao");

       String b = (String) ci.getVariable("yuyin");

       String c = (String) ci.getVariable("zuiwo");

       String d = (String) ci.getVariable("gulai");

       System.out.println(a);

       System.out.println(b);

       System.out.println(c);

       System.out.println(d);

       context.save(pi);

      

      

    }

    public void delete(){

       context.getGraphSession().deleteProcessDefinition(2);

    }

}

4,建立assignmentTaskManager包,处理流程,并将流程转下去(代码略)

核心流程代码如下

  <?xml version="1.0" encoding="UTF-8" ?>

- <process-definition xmlns="" name="TaskManager">

- <start-state name="begintask">

- <task name="tiaoxiebaoxiaodan">

  <assignment class="org.assignment.UserAssignment" />

  </task>

  <transition to="managersp" />

  </start-state>

- <task-node name="managersp">

- <task name="sp">

  <assignment class="org.assignment.ManagerAssignment" />

  </task>

  <transition to="caiwu" />

  <transition to="endtask" name="to endtask" />

  </task-node>

- <node name="caiwu">

- <event type="node-enter">

  <action class="org.actions.MyActions" />

  </event>

  <transition to="endtask" />

  </node>

  <end-state name="endtask" />

  </process-definition>

 

以上,不足之处,望指正

谢谢

 

原创粉丝点击