准备工作
开始的一些准备工作,网上教程很多,就不赘述。
- 在eclipse中安装插件,
- 下载Activiti的jar,我使用的是5.22.
- 用ecplise来创建一个Activiti的project。
- 下载mysql的驱动jar。
初始化数据库
初始化数据库有两种方式,跑java代码去初始化,或者手动执行sql语句去初始化。我一般用第二种,方便快捷。
这里我用的mysql5.5的版本。请选择跟环境对应的sql语句。
作图
流程图一般在diagrams下。画一张简单的图,如下。bpmn文件允许将流程图转为xml文件打开查看。
代码部分
部署流程
刚才不是画了一张图嘛,现在将该图部署起来。会在数据库中能够查看到该process 定义。
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定义
*/
@Test
public void deploymentProcessDefinition() {
//操作了数据库,向数据库表中插入数据
Deployment deployment = processEngine.getRepositoryService()//与流程定义和部署对象相关的service
.createDeployment() //创建一个部署对象
.name("helloworld入门")
.addClasspathResource("diagrams/HelloWorld.bpmn") //从classpath的资源加载,一次只能加载一个文件
.addClasspathResource("diagrams/HelloWorld.png")
.deploy(); //完成部署
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
需要有初始化processEngine。
执行该代码块,process的id会返回。
同时数据库的re表系列会有记录生成。
启动流程
所有操作都离不开引擎ProcessEngine.引擎写完一定是Service,我们操作的都是Service的API。
/**
* 启动流程实例
*/
@Test
public void deploymentProcessInition() {
ProcessInstance instance = processEngine.getRuntimeService()//与正在执行的流程相关的service
.startProcessInstanceByKey("helloworld");//使用流程定义的key来启动实例,
//好处:使用key启动,按照最新版本的流程定义启动。
System.out.println(instance.getId());//流程实例id
System.out.println(instance.getProcessDefinitionId());//流程定义id
}
得到的返回数据。5001是实例ID。2504的流程定义的id.
数据库中也能够查询到数据。
查询当前任务
//查询当前人的个人任务
@Test
public void findMyPersonTask() {
String assignee = "张三";
List<Task> myQueue = processEngine.getTaskService()
.createTaskQuery()//创建任务查询对象
.taskAssignee(assignee)
.list();
if(myQueue != null && myQueue.size() > 0) {
for(Task task : myQueue) {
System.out.println("任务ID : " + task.getId());
System.out.println("任务name : " + task.getName());
System.out.println("任务时间 : " + task.getCreateTime());
System.out.println("任务办理人 : " + task.getAssignee());
System.out.println("流程实例id : " + task.getProcessInstanceId());
System.out.println("流程实例id : " + task.getProcessInstanceId());
}
}
}
得到的是act_ru_task中的记录,只显示在assignee名下的task.其他id查询不到。
完成任务
表示该case由当前人员操作完成,进入下一个activity。交给下一个人员去操作。最后当都操作完成就进入history表。
/**
* 完成我名下的任务
*/
@Test
public void completeTask() {
String taskId= "5004";
processEngine.getTaskService()
.complete(taskId);
System.out.println("完成任务,任务ID : " + taskId);
}