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);
    }
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
 
             我要评论
我要评论 
                                             
                                             
                                             
                                             
                                            
发表评论