JBPM开发流程实例

上一篇文章说了JBPM的安装和配置,现在开始第一个流程的开发

1.将JBPM自带的example项目引进来,并将JBPM相应的jar包添加到classpath,在src目录下新建jBPM 4 Process Defination,命名为processTest.jpdl.xml,内容如下:

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

<process name="processTest" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start" g="145,32,80,58">
<transition name="to state" to="state" g="-59,-17"/>
</start>
<state name="state" g="131,117,67,59">
<transition name="to task" to="task" g="-53,-17"/>
</state>
<task name="task" g="141,203,77,64" assignee="Alex">
<transition name="to end" to="end" g="-47,-17"/>
</task>
<end name="end" g="139,302,77,56"/>
</process>

当然你也可以通过可视化编辑器去设计

 

2.部署流程,即把流程定义对象持久化到数据库,大体步骤如下:

a.引入mysql驱动

b.修改hibernate.cfg.xml

c.创建JBPM所用到的数据库表

d.根据流程定义文件,解释得到流程定义对象,把流程定义持久化到数据库

修改jbpm.hibernate.cfg.xml,内容如下

  <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>

     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

     <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/jbpm</property>

     <property name="hibernate.connection.username">root</property>

     <property name="hibernate.connection.password">你的mysql密码</property>

     <!-- <property name="hibernate.hbm2ddl.auto">create</property> -->

     <property name="hibernate.format_sql">true</property>

  由于我使用的是mysql,将对应的值进行修改,如果你的mysql引擎使用的是InnoDB那么方言应该需要是MySQLInnoDBDialect,引擎和方言要对应,否则在流程执行结束的时候会出现该问题,当然首先应该新建一个库名叫jbpm, <property name="hibernate.hbm2ddl.auto">create</property>系统第一次运行的时候要进行相关表的创建,第一次过后可以注释,以免每次运行都会重新创建新的表。

 

3.流程定义部署和流程实例测试

  a.部署流程定义

public static void deployProcess(String processName) {
  //1、创建JBPM配置对象
  Configuration configuration = new Configuration();
  //2、创建流程引擎
  ProcessEngine processEngine = configuration.buildProcessEngine();
  //3、获得数据仓库服务对象
  RepositoryService repositoryService = processEngine.getRepositoryService();
  //4、创建部署实例对象
  NewDeployment newDeployment = repositoryService.createDeployment();
  //5、从类路径下面增加流程部署文件到部署实例对象
  newDeployment = newDeployment.addResourceFromClasspath(processName);
  //6完成流程的部署
  String processNameString = newDeployment.deploy();
  System.out.println(processNameString);
}

 

  b.流程实例新建测试

  Configuration config = new Configuration();

  ProcessEngine engine = config.buildProcessEngine();

ExecutionService executionService = engine.getExecutionService();
//使用执行服务,根据已经部署的流程定义的名称processTest,发起流程实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey("processTest");
//获取流程实例ID
String pid = processInstance.getId();
System.out.println("流程实例ID为" + pid);
//获取当前活动的执行对象
Execution executionState = processInstance.findActiveExecutionIn("state");
//使用执行服务,发出执行信号结束当前活动,继续流程的执行
executionService.signalExecutionById(executionState.getId());
//使用执行服务,从持久化层中获取"最新"的流程实例对象
processInstance = executionService.findProcessInstanceById(pid);
//获取当前活动的执行对象
Execution executionTask = processInstance.findActiveExecutionIn("task");
TaskService taskService = engine.getTaskService();
//使用任务服务,获取用户Alex的任务,即task活动产生的任务,简单来说就是某个人的待办信息
Task task = taskService.findPersonalTasks("Alex").get(0);
//使用任务服务,完成任务
taskService.completeTask(task.getId());
//使用历史服务,创建历史任务查询
HistoryService historyService = engine.getHistoryService();
HistoryTask historyTask = historyService.createHistoryTaskQuery().taskId(task.getId()).uniqueResult();
String assignee = historyTask.getAssignee();
System.out.println("assignee的值为" + assignee);
//使用历史服务来创建历史流程实例查询
HistoryProcessInstance historyProcessInstance = historyService.createHistoryProcessInstanceQuery().processInstanceId(pid).uniqueResult();
System.out.println("历史流程实例的id为" + historyProcessInstance.getProcessInstanceId());

如果控制台不报错且相应信息打印出来则测试成功

posted @ 2012-10-25 10:08  似水年华  阅读(908)  评论(0)    收藏  举报