springboot集成activiti
pom.xml
<!--activiti-->
<activiti.version>5.22.0</activiti.version>
<dependency>
<groupid>org.activiti</groupid>
<artifactid>activiti-engine</artifactid>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupid>org.activiti</groupid>
<artifactid>activiti-spring</artifactid>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupid>org.activiti</groupid>
<artifactid>activiti-modeler</artifactid>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupid>org.activiti</groupid>
<artifactid>activiti-diagram-rest</artifactid>
<version>${activiti.version}</version>
</dependency>/**使用代码创建工作流需要的23张表*/
@test
public void createtable(){
processengineconfiguration processengineconfiguration = processengineconfiguration.createstandaloneprocessengineconfiguration();
//连接数据库的配置
processengineconfiguration.setjdbcdriver("com.mysql.jdbc.driver");
processengineconfiguration.setjdbcurl("jdbc:mysql://localhost:3306/itcast0711activiti?useunicode=true&characterencoding=utf8");
processengineconfiguration.setjdbcusername("root");
processengineconfiguration.setjdbcpassword("root");
/**
public static final string db_schema_update_false = "false";不能自动创建表,需要表存在
public static final string db_schema_update_create_drop = "create-drop";先删除表再创建表
public static final string db_schema_update_true = "true";如果表不存在,自动创建表
*/
processengineconfiguration.setdatabaseschemaupdate(processengineconfiguration.db_schema_update_true);
//工作流的核心对象,processenginee对象
processengine processengine = processengineconfiguration.buildprocessengine();
system.out.println("processengine:"+processengine);
}
注解 需要用到activiti.xfg.xml 吧activiti.xfg.xml放到resources目录下 不然processengine 会报null
processengine processengine = processengines.getdefaultprocessengine();
activiti.xfg.xml内容
<?xml version="1.0" encoding="utf-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
xsi:nonamespaceschemalocation="http://ehcache.org/ehcache.xsd"
updatecheck="false">
<diskstore path="java.io.tmpdir/tmp_ehcache"/>
<defaultcache eternal="false" maxelementsinmemory="1000"
overflowtodisk="false" diskpersistent="false" timetoidleseconds="0"
timetoliveseconds="600" memorystoreevictionpolicy="lru"/>
<cache name="user" eternal="false" maxelementsinmemory="10000"
overflowtodisk="false" diskpersistent="false" timetoidleseconds="0"
timetoliveseconds="0" memorystoreevictionpolicy="lfu"/>
</ehcache>
package com.bootdo.activiti.config;
import java.io.inputstream;
import java.util.hashmap;
import java.util.list;
import java.util.map;
import org.activiti.engine.processengine;
import org.activiti.engine.processengines;
import org.activiti.engine.repository.deployment;
import org.activiti.engine.runtime.processinstance;
import org.activiti.engine.task.task;
import org.junit.test;
public class exclusivegatewaytest {
processengine processengine = processengines.getdefaultprocessengine();
/**部署流程定义(从inputstream)*/
@test
public void deploymentprocessdefinition_inputstream(){
inputstream inputstreambpmn = this.getclass().getresourceasstream("exclusivegateway.bpmn");
inputstream inputstreamjpg = this.getclass().getresourceasstream("exclusivegateway.jpg");
deployment deployment = processengine.getrepositoryservice()//与流程定义和部署对象相关的service
.createdeployment()//创建一个部署对象
.name("排他网关")//添加部署的名称
.addinputstream("exclusivegateway.bpmn", inputstreambpmn)//
.addinputstream("exclusivegateway.jpg", inputstreamjpg)//
.deploy();//完成部署
system.out.println("部署id:"+deployment.getid());//
system.out.println("部署名称:"+deployment.getname());//
}
/**启动流程实例*/
@test
public void startprocessinstance(){
//流程定义的key
string processdefinitionkey = "exclusivegateway";
processinstance pi = processengine.getruntimeservice()//与正在执行的流程实例和执行对象相关的service
.startprocessinstancebykey(processdefinitionkey);//使用流程定义的key启动流程实例,key对应helloworld.bpmn文件中id的属性值,使用key值启动,默认是按照最新版本的流程定义启动
system.out.println("流程实例id:"+pi.getid());//流程实例id 101
system.out.println("流程定义id:"+pi.getprocessdefinitionid());//流程定义id helloworld:1:4
}
/**查询当前人的个人任务*/
@test
public void findmypersonaltask(){
string assignee = "王小五";
list<task> list = processengine.gettaskservice()//与正在执行的任务管理相关的service
.createtaskquery()//创建任务查询对象
/**查询条件(where部分)*/
.taskassignee(assignee)//指定个人任务查询,指定办理人
// .taskcandidateuser(candidateuser)//组任务的办理人查询
// .processdefinitionid(processdefinitionid)//使用流程定义id查询
// .processinstanceid(processinstanceid)//使用流程实例id查询
// .executionid(executionid)//使用执行对象id查询
/**排序*/
.orderbytaskcreatetime().asc()//使用创建时间的升序排列
/**返回结果集*/
// .singleresult()//返回惟一结果集
// .count()//返回结果集的数量
// .listpage(firstresult, maxresults);//分页查询
.list();//返回列表
if(list!=null && list.size()>0){
for(task task:list){
system.out.println("任务id:"+task.getid());
system.out.println("任务名称:"+task.getname());
system.out.println("任务的创建时间:"+task.getcreatetime());
system.out.println("任务的办理人:"+task.getassignee());
system.out.println("流程实例id:"+task.getprocessinstanceid());
system.out.println("执行对象id:"+task.getexecutionid());
system.out.println("流程定义id:"+task.getprocessdefinitionid());
system.out.println("########################################################");
}
}
}
/**完成我的任务*/
@test
public void completemypersonaltask(){
//任务id
//select * from act_ru_task; --运行时任务节点表id
string taskid = "304";
//完成任务的同时,设置流程变量,使用流程变量用来指定完成任务后,下一个连线,对应exclusivegateway.bpmn文件中${money>1000}
map<string, object> variables = new hashmap<string, object>();
variables.put("money", 200);
processengine.gettaskservice()//与正在执行的任务管理相关的service
.complete(taskid,variables);
system.out.println("完成任务:任务id:"+taskid);
}
}exclusivegateway.bpmn


<?xml version="1.0" encoding="utf-8"?>
<definitions xmlns="http://www.omg.org/spec/bpmn/20100524/model" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/bpmn/20100524/di" xmlns:omgdc="http://www.omg.org/spec/dd/20100524/dc" xmlns:omgdi="http://www.omg.org/spec/dd/20100524/di" typelanguage="http://www.w3.org/2001/xmlschema" expressionlanguage="http://www.w3.org/1999/xpath" targetnamespace="http://www.activiti.org/test">
<process id="exclusivegateway" name="exclusivegatewayprocess" isexecutable="true">
<extensionelements>
<activiti:executionlistener event="start" class="com.bootdo.activiti.config.zengstartlistener"></activiti:executionlistener>
<activiti:executionlistener event="end" class="com.bootdo.activiti.config.zengendlistener"></activiti:executionlistener>
</extensionelements>
<startevent id="startevent1" name="start"></startevent>
<usertask id="usertask1" name="费用报销申请" activiti:assignee="王小五"></usertask>
<sequenceflow id="flow1" sourceref="startevent1" targetref="usertask1"></sequenceflow>
<usertask id="usertask2" name="审批【部门经理】" activiti:assignee="赵小六"></usertask>
<usertask id="usertask3" name="财务" activiti:assignee="胡小八"></usertask>
<usertask id="usertask4" name="审批【总经理】" activiti:assignee="田小七"></usertask>
<exclusivegateway id="exclusivegateway1" name="exclusive gateway" default="默认执行财务"></exclusivegateway>
<sequenceflow id="flow2" sourceref="usertask1" targetref="exclusivegateway1"></sequenceflow>
<sequenceflow id="flow3" name="金额小于等于1000,大于等于500" sourceref="exclusivegateway1" targetref="usertask2">
<conditionexpression xsi:type="tformalexpression"><![cdata[${money>=500 && money<=1000}]]></conditionexpression>
</sequenceflow>
<sequenceflow id="默认执行财务" name="默认执行财务" sourceref="exclusivegateway1" targetref="usertask3"></sequenceflow>
<sequenceflow id="flow5" name="金额大于1000元" sourceref="exclusivegateway1" targetref="usertask4">
<conditionexpression xsi:type="tformalexpression"><![cdata[${money>1000}]]></conditionexpression>
</sequenceflow>
<endevent id="endevent1" name="end"></endevent>
<sequenceflow id="flow6" sourceref="usertask2" targetref="servicetask2"></sequenceflow>
<sequenceflow id="flow7" sourceref="usertask3" targetref="servicetask3"></sequenceflow>
<sequenceflow id="flow8" sourceref="usertask4" targetref="servicetask1"></sequenceflow>
<servicetask id="servicetask1" name="总经理service task" activiti:class="com.bootdo.activiti.config.zengservicelistener3"></servicetask>
<servicetask id="servicetask2" name="部门经理service task" activiti:class="com.bootdo.activiti.config.zengservicelistener1"></servicetask>
<servicetask id="servicetask3" name="财务service task" activiti:class="com.bootdo.activiti.config.zengservicelistener2"></servicetask>
<sequenceflow id="flow9" sourceref="servicetask3" targetref="endevent1"></sequenceflow>
<sequenceflow id="flow10" sourceref="servicetask1" targetref="endevent1"></sequenceflow>
<sequenceflow id="flow11" sourceref="servicetask2" targetref="endevent1"></sequenceflow>
</process>
<bpmndi:bpmndiagram id="bpmndiagram_exclusivegateway">
<bpmndi:bpmnplane bpmnelement="exclusivegateway" id="bpmnplane_exclusivegateway">
<bpmndi:bpmnshape bpmnelement="startevent1" id="bpmnshape_startevent1">
<omgdc:bounds height="35.0" width="35.0" x="340.0" y="50.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="usertask1" id="bpmnshape_usertask1">
<omgdc:bounds height="55.0" width="105.0" x="305.0" y="140.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="usertask2" id="bpmnshape_usertask2">
<omgdc:bounds height="61.0" width="141.0" x="80.0" y="390.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="usertask3" id="bpmnshape_usertask3">
<omgdc:bounds height="55.0" width="105.0" x="300.0" y="393.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="usertask4" id="bpmnshape_usertask4">
<omgdc:bounds height="55.0" width="121.0" x="533.0" y="390.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="exclusivegateway1" id="bpmnshape_exclusivegateway1">
<omgdc:bounds height="40.0" width="40.0" x="337.0" y="260.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="endevent1" id="bpmnshape_endevent1">
<omgdc:bounds height="35.0" width="35.0" x="335.0" y="650.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="servicetask1" id="bpmnshape_servicetask1">
<omgdc:bounds height="55.0" width="130.0" x="529.0" y="520.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="servicetask2" id="bpmnshape_servicetask2">
<omgdc:bounds height="55.0" width="151.0" x="75.0" y="520.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnshape bpmnelement="servicetask3" id="bpmnshape_servicetask3">
<omgdc:bounds height="55.0" width="141.0" x="282.0" y="522.0"></omgdc:bounds>
</bpmndi:bpmnshape>
<bpmndi:bpmnedge bpmnelement="flow1" id="bpmnedge_flow1">
<omgdi:waypoint x="357.0" y="85.0"></omgdi:waypoint>
<omgdi:waypoint x="357.0" y="140.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow2" id="bpmnedge_flow2">
<omgdi:waypoint x="357.0" y="195.0"></omgdi:waypoint>
<omgdi:waypoint x="357.0" y="260.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow3" id="bpmnedge_flow3">
<omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="150.0" y="390.0"></omgdi:waypoint>
<bpmndi:bpmnlabel>
<omgdc:bounds height="64.0" width="100.0" x="181.0" y="292.0"></omgdc:bounds>
</bpmndi:bpmnlabel>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="默认执行财务" id="bpmnedge_默认执行财务">
<omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="393.0"></omgdi:waypoint>
<bpmndi:bpmnlabel>
<omgdc:bounds height="48.0" width="72.0" x="360.0" y="332.0"></omgdc:bounds>
</bpmndi:bpmnlabel>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow5" id="bpmnedge_flow5">
<omgdi:waypoint x="357.0" y="300.0"></omgdi:waypoint>
<omgdi:waypoint x="593.0" y="390.0"></omgdi:waypoint>
<bpmndi:bpmnlabel>
<omgdc:bounds height="48.0" width="84.0" x="430.0" y="310.0"></omgdc:bounds>
</bpmndi:bpmnlabel>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow6" id="bpmnedge_flow6">
<omgdi:waypoint x="150.0" y="451.0"></omgdi:waypoint>
<omgdi:waypoint x="150.0" y="520.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow7" id="bpmnedge_flow7">
<omgdi:waypoint x="352.0" y="448.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="522.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow8" id="bpmnedge_flow8">
<omgdi:waypoint x="593.0" y="445.0"></omgdi:waypoint>
<omgdi:waypoint x="594.0" y="520.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow9" id="bpmnedge_flow9">
<omgdi:waypoint x="352.0" y="577.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="650.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow10" id="bpmnedge_flow10">
<omgdi:waypoint x="594.0" y="575.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="650.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
<bpmndi:bpmnedge bpmnelement="flow11" id="bpmnedge_flow11">
<omgdi:waypoint x="150.0" y="575.0"></omgdi:waypoint>
<omgdi:waypoint x="352.0" y="650.0"></omgdi:waypoint>
</bpmndi:bpmnedge>
</bpmndi:bpmnplane>
</bpmndi:bpmndiagram>
</definitions>监听器
开始结束流程监听器

开始流程监听器(启动流程的时候就会进入这个类)
package com.bootdo.activiti.config;
import org.activiti.engine.delegate.delegateexecution;
import org.activiti.engine.delegate.executionlistener;
import org.springframework.stereotype.service;
@service("zengstartlistener")
public class zengstartlistener implements executionlistener {
@override
public void notify(delegateexecution delegateexecution) throws exception {
system.err.println("zengstartlistener =====================>");
system.err.println("zengstartlistener =====================>");
system.err.println("zengstartlistener =====================>");
}
}结束流程监听器(结束流程的时候就会进入这个类)
package com.bootdo.activiti.config;
import org.activiti.engine.delegate.delegateexecution;
import org.activiti.engine.delegate.executionlistener;
import org.springframework.stereotype.service;
@service("zengendlistener")
public class zengendlistener implements executionlistener {
@override
public void notify(delegateexecution delegateexecution) throws exception {
system.err.println("zengendlistener =====================>");
system.err.println("zengendlistener =====================>");
system.err.println("zengendlistener =====================>");
}
}
service task监听器(上一个流程结束会自动进入service task监听器类)

package com.bootdo.activiti.config;
import org.activiti.engine.delegate.delegateexecution;
import org.activiti.engine.delegate.expression;
import org.activiti.engine.delegate.javadelegate;
import org.springframework.stereotype.service;
@service("zengservicelistener3")
public class zengservicelistener3 implements javadelegate{
//成员变量名称必须和组件中设置的字段名称保持一致
private expression expression;
@override
public void execute(delegateexecution execution) {
object o=expression.getvalue(execution);
string text=expression.getexpressiontext();
system.err.println("zengservicelistener3执行了服务任务===");
system.out.println(o);
system.out.println(text);
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论