文章目录

  • Activiti的使用技巧
    • 1、环境的搭建:activiti-spring 7.0.0+连接池+mysql
      • 1.1 依赖如下:
      • 1.2 连接池和数据库配置:
      • 1.3 activiti的配置,通过config文件注入的方式:
    • 2、部署
      • 2.1 自动部署
      • 2.2 手动部署
      • 2.3 表单介绍
    • 3、创建流程表
    • 4、开始流程
    • 5、处理任务
      • 5.1 获取任务
      • 5.2 处理任务
    • 6、监听器设置:
      • 6.1 class方式:填写的是class全路径,具体的方法通过实现ExecutionListener,TaskListener判断实现
      • 6.2 expression方式:填写的是具体的方法,也就是class.method()
      • 6.3 delegateExpression方式:处理的是eventlistener,是处理对事件的监听,delegateExpression的意思是:class和events描述,delegate的意思是表达的方式是不是直接告诉Expression,有通过activiti。
    • 7、变量的设置:
    • 8、流程的操作
      • 8.1 委派任务
      • 8.2 根据指定人查询任务
      • 8.3 根据任务拥有者查询任务
      • 8.4 委派人完成任务
      • 8.5 将任务委派他人完成
      • 8.5 挂起流程实例
      • 8.6 删除流程实例
      • 8.7激活挂起的流程实例
      • 8.8 激活、挂起流程定义

Activiti的使用技巧

1、环境的搭建:activiti-spring 7.0.0+连接池+mysql

1.1 依赖如下:

    <properties><java.version>1.11</java.version></properties><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.activiti</groupId><artifactId>activiti-spring</artifactId><version>7.0.0.GA</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.9</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.6</version></dependency></dependencies>

1.2 连接池和数据库配置:

注意配置nullCatalogMeansCurrent=true,否则自动部署时,表无法创建成功。

spring:#业务核心数据源datasource:url: jdbc:mysql://localhost:3306/d201903290931?characterEncoding=utf8&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=trueusername: rootpassword: 880808driver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource#druid配置druid:#initialSizeinitialSize: 10#minPoolSizeminIdle: 10#maxPoolSizemaxActive: 100poolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 100#是否自动提交事务,如果应用中通过Spring或其他框架显示控制事务提交则可以设置为false,否则设置为truedefaultAutoCommit: false#配置获取连接等待超时的时间maxWait: 10000#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒timeBetweenEvictionRunsMillis: 60000#配置一个连接在池中最小生存的时间,单位毫秒minEvictableIdleTimeMillis: 300000#连接检测属性配置testWhileIdle: truevalidationQuery: SELECT 'x' FROM DUALvalidationQueryTimeout: 5000connectionProperties: oracle.net.CONNECT_TIMEOUT=3000;oracle.net.READ_TIMEOUT=5000removeAbandoned: trueremoveAbandonedTimeoutMillis: 300000testOnBorrow: false

1.3 activiti的配置,通过config文件注入的方式:

关注2点:自动部署的文件路径,监听器通过bean注入。

@Configuration
public class ActivitiConfig {@Autowiredprivate MyExecutionListener myExecutionListener;@Autowiredprivate MyTaskListener1 myTaskListener1;@Beanpublic ProcessEngine processEngine(DataSourceTransactionManager transactionManager, DataSource dataSource) throws IOException {SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration();//自动部署已有的流程文件Resource[] resources = new PathMatchingResourcePatternResolver().getResources(ResourceLoader.CLASSPATH_URL_PREFIX + "/processes/*.xml");configuration.setTransactionManager(transactionManager);configuration.setDataSource(dataSource);configuration.setDatabaseSchemaUpdate("true");configuration.setAsyncExecutorActivate(true);configuration.setHistoryLevel(HistoryLevel.FULL);configuration.setDeploymentResources(resources);Map<Object, Object> beans = new HashMap<>(10);beans.put("myExecutionListener", myExecutionListener);beans.put("myTaskListener1", myTaskListener1);
/*       beans.put("surveyProcessListener", surveyProcessListener);beans.put("lossVerificationProcessListener", lossVerificationProcessListener);beans.put("investigateProcessListener", investigateProcessListener);*/configuration.setBeans(beans);//configuration.setDbIdentityUsed(false);return configuration.buildProcessEngine();}@Beanpublic RepositoryService repositoryService(ProcessEngine processEngine) {return processEngine.getRepositoryService();}@Beanpublic RuntimeService runtimeService(ProcessEngine processEngine) {return processEngine.getRuntimeService();}@Beanpublic TaskService taskService(ProcessEngine processEngine) {return processEngine.getTaskService();}@Beanpublic HistoryService historyService(ProcessEngine processEngine) {return processEngine.getHistoryService();}@Beanpublic ManagementService managementService(ProcessEngine processEngine) {return processEngine.getManagementService();}//@Bean//public IdentityService identityService(ProcessEngine processEngine) {//        return processEngine.getIdentityService();
//    }}

当无法注入的时候,可以使用通用类,直接注入:

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;/*** @author xmaxing* @description* @date 2019-03-29 16:45*/
@Component
public class SpringContextUtil implements ApplicationContextAware {// Spring应用上下文环境@Autowiredprivate static ApplicationContext applicationContext;/*** 实现ApplicationContextAware接口的回调方法,设置上下文环境** @param applicationContext*/@Overridepublic void setApplicationContext(ApplicationContext applicationContext) {SpringContextUtil.applicationContext = applicationContext;}/*** @return ApplicationContext*/public static ApplicationContext getApplicationContext() {return applicationContext;}/*** 获取对象** @param name* @return Object* @throws BeansException*/public static Object getBean(String name) throws BeansException {return applicationContext.getBean(name);}}

2、部署

2.1 自动部署

springboot会自动部署,就可以直接开始流程处理了。

2.2 手动部署

    @Overridepublic boolean devlopActiviti(String folderPath, HashMap<String, String> map) {Deployment deploy = repositoryService.createDeployment()// 创建一个部署构建器.addClasspathResource(folderPath + File.separator + map.get("id") + ".bpmn")// 从类路径一次只能添加一个文件.addClasspathResource(folderPath + File.separator + map.get("id") + ".png")// 流程图片.name(map.get("name")).category(map.get("category")).deploy();LOGGER.info("流程名称【 {}】", deploy.getName());LOGGER.info("流程id【{}】", deploy.getId());LOGGER.info("流程类别【{}】", deploy.getCategory());return true;}@Overridepublic boolean deployActivitiByZip(String folderPath, HashMap<String, String> map) {InputStream in = this.getClass().getClassLoader().getResourceAsStream("folderPath" + File.separator + map.get("id") + ".bpmn");ZipInputStream zipInputStream = new ZipInputStream(in);Deployment deploy = repositoryService.createDeployment()// 创建一个部署构建器.addZipInputStream(zipInputStream).name(map.get("name")).category(map.get("category")).deploy();LOGGER.info("流程名称【 {}】", deploy.getName());LOGGER.info("流程id【{}】", deploy.getId());LOGGER.info("流程类别【{}】", deploy.getCategory());return true;}

测试

    @Testpublic void deplomentActiviti() {String folderPath = "study/activiti/diagrams/leaveBill";HashMap<String, String> map = new HashMap<>();map.put("name", "请假流程");// 名称map.put("id", "leaveBill");// idmap.put("category", "办公流程");// 类别

2.3 表单介绍

ACT_RE_DEPLOYMENT(部署对象表)
ACT_RE_PROCDEF(流程定义表)
ACT_GE_BYTEARRAY(资源文件表)
ACT_GE_PROPERTY(主键生成表)ACT_RE_*: 'RE'表示repository。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。
ACT_RU_*: 'RU'表示runtime。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。
ACT_ID_*: 'ID'表示identity。 这些表包含身份信息,比如用户,组等等。
ACT_HI_*: 'HI'表示history。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。
ACT_GE_*: 'GE'表示general。通用数据, 用于不同场景下,如存放资源文件。资源库流程规则表1) act_re_deployment 部署信息表2) act_re_model  流程设计模型部署表3) act_re_procdef  流程定义数据表运行时数据库表1) act_ru_execution运行时流程执行实例表2) act_ru_identitylink运行时流程人员表,主要存储任务节点与参与者的相关信息3) act_ru_task运行时任务节点表4) act_ru_variable运行时流程变量数据表历史数据库表1) act_hi_actinst 历史节点表2) act_hi_attachment历史附件表3) act_hi_comment历史意见表4) act_hi_identitylink历史流程人员表5) act_hi_detail历史详情表,提供历史变量的查询6) act_hi_procinst历史流程实例表7) act_hi_taskinst历史任务实例表8) act_hi_varinst历史变量表组织机构表1) act_id_group用户组信息表2) act_id_info用户扩展信息表3) act_id_membership用户与用户组对应信息表4) act_id_user用户信息表这四张表很常见,基本的组织机构管理,关于用户认证方面建议还是自己开发一套,组件自带的功能太简单,使用中有很多需求难以满足通用数据表1) act_ge_bytearray二进制数据表2) act_ge_property属性数据表存储整个流程引擎级别的数据,初始化表结构时,会默认插入三条记录。

3、创建流程表

startevent–>usertask1–>usertask2–>endevent

  <process id="listenerTask1" name="任务监听器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" expression="${myExecutionListener.processStart(execution)}"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" expression="${myTaskListener1.taskComplete(task)}"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements></userTask><sequenceFlow id="flow1" sourceRef="startevent" targetRef="usertask1"></sequenceFlow><sequenceFlow id="flow2" sourceRef="usertask1" targetRef="endevent1"></sequenceFlow><userTask id="usertask2" name="User Task" activiti:assignee="#{checkBywhom}"></userTask><sequenceFlow id="flow3" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow><endEvent id="endevent2" name="End"></endEvent><sequenceFlow id="flow4" sourceRef="usertask2" targetRef="endevent2"></sequenceFlow></process>

4、开始流程

    @Overridepublic boolean startActiviti(String processDefinitionKey, HashMap<String, Object> map) {// 取得流程实例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);LOGGER.info("流程(流程执行对象实例)id【{}】", processInstance.getId());// execution对象LOGGER.info("流程实例id:【{}】", processInstance.getProcessInstanceId());// processInstance对象LOGGER.info("流程定义id【{}】", processInstance.getProcessDefinitionId());// 默认为最新的idreturn true;}
    @Testpublic void startActiviti() {String processDefinitionKey = "listenerTask1";// 设置变量HashMap<String, Object> map = new HashMap<>();map.put("createLoginName", "31smart.geng.123");activitiService.startActiviti(processDefinitionKey, map);}

注意:流程实例ID(process的ID),流程定义ID(process的定义描述ID),执行对象ID(process的具体task的ID),processDefinitionKey为流程的定义的名称。

2019-03-31 22:27:18.776  INFO 1528 --- [           main] c.e.d.service.Impl.ActivitiServiceImpl   : 流程(流程执行对象实例)id【175001】
2019-03-31 22:27:18.776  INFO 1528 --- [           main] c.e.d.service.Impl.ActivitiServiceImpl   : 流程实例id:【175001】
2019-03-31 22:27:18.777  INFO 1528 --- [           main] c.e.d.service.Impl.ActivitiServiceImpl   : 流程定义id【listenerTask1:10:160009】

5、处理任务

5.1 获取任务

    @Overridepublic boolean getTaskByLoginName(String processDefinitionKey, String loginName) {TaskQuery taskQuery = taskService.createTaskQuery();List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskAssignee(loginName).list();for (Task task : list) {LOGGER.info("任务处理人【{}】", task.getAssignee());LOGGER.info("流程名称【{}】", task.getName());LOGGER.info("任务id【{}】", task.getId());LOGGER.info("流程定义id【{}】", task.getProcessDefinitionId());LOGGER.info("执行对象id【{}】", task.getExecutionId());}return true;}
    @Overridepublic List<Task> getTaskByDeploymentId(String deploymentId, String processDefinitionKey, String executionId,String loginName) {List<Task> list = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).deploymentId(deploymentId).taskAssignee(loginName).executionId(executionId).list();// 获取当前人的return list;}

5.2 处理任务

   @Overridepublic boolean startActivitiAndFinsh(String processDefinitionKey, HashMap<String, Object> map) {// 取得流程实例ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, map);LOGGER.info("流程(流程执行对象实例)id【{}】", processInstance.getId());// execution对象LOGGER.info("流程实例id:【{}】", processInstance.getProcessInstanceId());// processInstance对象LOGGER.info("流程定义id【{}】", processInstance.getProcessDefinitionId());// 默认为最新的idLOGGER.info("流程实例id【{}】", processInstance.getSuperExecutionId());List<Task> tasks = this.getTaskByDeploymentId(processInstance.getDeploymentId(), processDefinitionKey,processInstance.getId(), (String) map.get("createLoginName"));for (Task task : tasks) {this.finshTask(task.getId());}return true;}
    @Testpublic void finshTask() {String taskId = "137507";// 设置变量HashMap<String, Object> map = new HashMap<>();map.put("checkBywhom", "3001smart.geng.123");activitiService.finshTask(taskId,map);
//        activitiService.finshTask(taskId);}

6、监听器设置:

6.1 class方式:填写的是class全路径,具体的方法通过实现ExecutionListener,TaskListener判断实现

  <process id="listenerTask" name="任务监听器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" class="com.example.demo13.service.ActivitiListener"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" class="com.example.demo13.service.MyTaskListener"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements>
public class ActivitiListener implements ExecutionListener,TaskListener {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);private static final long serialVersionUID = 6200534335483960408L;private Expression arg;public Expression getArg() {return arg;}public void setArg(Expression arg) {this.arg = arg;}@Overridepublic void notify(DelegateExecution execution) {String eventName = execution.getEventName();// startif ("start".equals(eventName)) {LOGGER.info("start=========");HashMap<String, Object> map = new HashMap<>();} else if ("end".equals(eventName)) {LOGGER.info("end=========");} else if ("take".equals(eventName)) {LOGGER.info("take=========");}}@Overridepublic void notify(DelegateTask delegateTask) {// 实现TaskListener中的方法String eventName = delegateTask.getEventName();LOGGER.info("任务监听器:{}", arg.getValue(delegateTask));if ("create".endsWith(eventName)) {LOGGER.info("create=========");} else if ("assignment".endsWith(eventName)) {LOGGER.info("assignment========");} else if ("complete".endsWith(eventName)) {LOGGER.info("complete===========");} else if ("delete".endsWith(eventName)) {LOGGER.info("delete=============");}}}

6.2 expression方式:填写的是具体的方法,也就是class.method()

  <process id="listenerTask1" name="任务监听器流程" isExecutable="true"><startEvent id="startevent" name="Start"><extensionElements><activiti:executionListener event="start" expression="${myExecutionListener.processStart(execution)}"></activiti:executionListener></extensionElements></startEvent><endEvent id="endevent1" name="End"></endEvent><userTask id="usertask1" name="User Task" activiti:assignee="#{createLoginName}"><extensionElements><activiti:taskListener event="complete" expression="${myTaskListener1.taskComplete(task)}"><activiti:field name="arg"><activiti:string><![CDATA[gengzhn]]></activiti:string></activiti:field></activiti:taskListener></extensionElements>

类需要添加到bean()

        Map<Object, Object> beans = new HashMap<>(10);beans.put("myExecutionListener", myExecutionListener);beans.put("myTaskListener1", myTaskListener1);
/*       beans.put("surveyProcessListener", surveyProcessListener);beans.put("lossVerificationProcessListener", lossVerificationProcessListener);beans.put("investigateProcessListener", investigateProcessListener);*/configuration.setBeans(beans);
@Service
public class MyExecutionListener {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);public void processStart(DelegateExecution execution) {LOGGER.info("start===================================================================");}}
@Service
public class MyTaskListener1 {private static final Logger LOGGER = LoggerFactory.getLogger(ActivitiServiceImpl.class);private Expression arg;public Expression getArg() {return arg;}public void setArg(Expression arg) {this.arg = arg;}public void taskComplete(DelegateTask task) {//        LOGGER.info("任务监听器:{}", arg.getValue(delegateTask));LOGGER.info("任务监听器:complete===========");}}

6.3 delegateExpression方式:处理的是eventlistener,是处理对事件的监听,delegateExpression的意思是:class和events描述,delegate的意思是表达的方式是不是直接告诉Expression,有通过activiti。

示例如下:

    <extensionElements><activiti:eventListener events="ACTIVITY_CANCELLED" delegateExpression="${surveyProcessListener}"></activiti:eventListener></extensionElements>
 <extensionElements><activiti:eventListener class="org.activiti.engine.test.MyEventListener" /><activiti:eventListener delegateExpression="${testEventListener}" events="JOB_EXECUTION_SUCCESS,JOB_EXECUTION_FAILURE" /></extensionElements>
  <extensionElements><activiti:eventListener class="org.activiti.engine.test.MyEventListener" entityType="task" /><activiti:eventListener delegateExpression="${testEventListener}" events="ENTITY_CREATED" entityType="task" /></extensionElements>
Supported values for the entityType are: attachment, comment, execution, identity-link, job, process-instance, process-definition, task.
@Service
public class SurveyProcessListener implements ActivitiEventListener {}@Overridepublic void onEvent(ActivitiEvent event) {//如果流程取消if (ActivitiEventType.ACTIVITY_CANCELLED == event.getType()) {// TODO: 2019-03-08 流程取消,发送各种消息,String processInstanceId = event.getProcessInstanceId();log.info("surveyProcessListener.onEvent.ACTIVITY_CANCELLED, processInstanceId:{}", processInstanceId);}}@Overridepublic boolean isFailOnException() {return false;}
}

7、变量的设置:

在代理监听器里无法注入RuntimeService或者taskService,使用bean注入,或者使用delegateTask.setVariable

            ((RuntimeService)SpringContextUtil.getBean("runtimeService")).setVariable(delegateTask.getExecutionId(),"checkBywhom", "x00000000xoo");runtimeService.setVariable(delegateTask.getExecutionId(),"checkBywhom", "xxoo");
delegateTask.setVariable("checkBywhom", "xxxxxxx");LOGGER.info("complete===========");
  @Overridepublic boolean setVariableByExcutionId(String executionId, boolean isLocal, HashMap<String, Object> map) {/** runtimeService.setVariablesLocal(executionId, variableName, value);** 设置本执行对象的变量,该作用域只在当前的executionId中 runtimeService.setVariableLocal(executionId,* variableName, value);** 可以设置对个变量,放在map中*/if (isLocal) {runtimeService.setVariablesLocal(executionId, map);} else {runtimeService.setVariables(executionId, map);}return true;}@Overridepublic Map<String, Object> getVariableByExcutionId(String executionId, boolean isLocal) {Map<String, Object> variablesMap = new HashMap<String, Object>();if (isLocal) {variablesMap = runtimeService.getVariablesLocal(executionId);} else {variablesMap = runtimeService.getVariables(executionId);}return variablesMap;}@Overridepublic boolean setVariableByTaskId(String taskId, String objectName, Object object) {taskService.setVariable(taskId, objectName, object);return true;}@Overridepublic boolean setVariableByTaskId(String taskId, boolean isLocal, HashMap<String, Object> map) {/** taskService.setVariable(taskId, variableName, value);** 设置本执行对象的变量,该作用域只在当前的executionId中 taskService.setVariableLocal(taskId,* variableName, value); 可以设置对个变量,放在map中*/if (isLocal) {taskService.setVariablesLocal(taskId, map);} else {taskService.setVariables(taskId, map);}return true;}@Overridepublic Map<String, Object> getVariableByTaskId(String taskId, boolean isLocal) {Map<String, Object> variablesMap = new HashMap<String, Object>();if (isLocal) {variablesMap = taskService.getVariablesLocal(taskId);} else {variablesMap = taskService.getVariables(taskId);}return variablesMap;}@Overridepublic <T> T getVariableByTaskId(String taskId, String objectName, Class<T> tClass) {T bean = (T) taskService.getVariable(taskId, objectName);return bean;}@Overridepublic boolean delegateTask(String taskId, String loginName) {taskService.delegateTask(taskId, loginName);return true;}

8、流程的操作

8.1 委派任务

  /*** 委派任务** @param taskId* @param loginName* @return*/boolean delegateTask(String taskId, String loginName);@Overridepublic boolean delegateTask(String taskId, String loginName) {taskService.delegateTask(taskId, loginName);return true;}/*** 指定代办人*/@Testpublic void delegateTask() {String taskId = "2511";String loginName = "0003";activitiService.delegateTask(taskId, loginName);}

8.2 根据指定人查询任务

    /*** 根据指定人查询任务** @param processDefinitionKey* @param assignee* @return*/boolean getTaskByAssignee(String processDefinitionKey, String assignee);@Overridepublic boolean getTaskByAssignee(String processDefinitionKey, String assignee) {TaskQuery taskQuery = taskService.createTaskQuery();// 任务列表List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskAssignee(assignee).list();// 指定办理人for (Task task : list) {LOGGER.info("任务处理人【{}】", task.getAssignee());LOGGER.info("流程名称【{}】", task.getName());LOGGER.info("任务id【{}】", task.getId());LOGGER.info("流程定义id【{}】", task.getProcessDefinitionId());LOGGER.info("执行对象id【{}】", task.getExecutionId());}return true;}@Testpublic void getTaskByAssignee() {String processDefinitionKey = "delegateTask";String assignee = "0003";activitiService.getTaskByAssignee(processDefinitionKey, assignee);}

8.3 根据任务拥有者查询任务

/*** 根据任务拥有者查询任务** @param processDefinitionKey* @param owner* @return*/
boolean getTaskByOwner(String processDefinitionKey, String owner);@Overridepublic boolean getTaskByOwner(String processDefinitionKey, String owner) {TaskQuery taskQuery = taskService.createTaskQuery();// 任务列表List<Task> list = taskQuery.processDefinitionKey(processDefinitionKey).taskOwner(owner).list();// 指定办理人for (Task task : list) {LOGGER.info("任务处理人【{}】", task.getAssignee());LOGGER.info("流程名称【{}】", task.getName());LOGGER.info("任务id【{}】", task.getId());LOGGER.info("流程定义id【{}】", task.getProcessDefinitionId());LOGGER.info("执行对象id【{}】", task.getExecutionId());LOGGER.info("任务拥有者【{}】", task.getOwner());}return true;}@Testpublic void getTaskByOwner() {String processDefinitionKey = "delegateTask";String owner = "0003";activitiService.getTaskByOwner(processDefinitionKey, owner);}

8.4 委派人完成任务

/*** 委派人完成任务** @param taskId* @param map* @return*/
boolean resolveTask(String taskId, Map<String, Object> map);@Overridepublic boolean resolveTask(String taskId, Map<String, Object> map) {taskService.resolveTask(taskId, map);return true;}/*** 正在运行的任务表中被委派人办理任务后任务会回到委派人 ,历史任务表中也一样,只是多了一个人进行审批*/@Testpublic void resolveTask() {String taskId = "2511";Map<String, Object> map = new HashMap<>();activitiService.resolveTask(taskId, map);}

8.5 将任务委派他人完成

/*** 将任务委派他人完成** @param taskId* @param assignee* @return*/
boolean trunTask(String taskId, String assignee);@Overridepublic boolean trunTask(String taskId, String assignee) {taskService.setAssignee(taskId, assignee);return true;}/*** 任务转办,将任务交给其他人处理*/@Testpublic void turnTask() {String taskId = "7511";String assignee = "0003";activitiService.trunTask(taskId, assignee);}

8.5 挂起流程实例

/*** 挂起流程实例** @param processInstanceId* @return*/
boolean suspendProcessInstanceById(String processInstanceId);@Overridepublic boolean suspendProcessInstanceById(String processInstanceId) {runtimeService.suspendProcessInstanceById(processInstanceId);return true;}/*** 挂起流程*/@Testpublic void suspendProcess() {//SuspensionState ACTIVE = new SuspensionStateImpl(1, "active"); 激活//  SuspensionState SUSPENDED = new SuspensionStateImpl(2, "suspended"); 挂起String processInstanceId = "70001";activitiService.suspendProcessInstanceById(processInstanceId);}

8.6 删除流程实例

/*** 删除流程实例** @param processInstanceId* @param reason* @return*/
boolean deleteProcessInstance(String processInstanceId, String reason);@Overridepublic boolean deleteProcessInstance(String processInstanceId, String reason) {runtimeService.deleteProcessInstance(processInstanceId, reason);return true;}@Testpublic void deleteProcessInstance() {String processInstanceId = "70001";String reason = "删除原因";activitiService.deleteProcessInstance(processInstanceId, reason);}

8.7激活挂起的流程实例

/*** 激活流程实例(激活挂起的流程实例)** @param processInstanceId* @return*/
boolean activateProcessInstanceById(String processInstanceId);@Overridepublic boolean activateProcessInstanceById(String processInstanceId) {runtimeService.activateProcessInstanceById(processInstanceId);return true;}@Testpublic void activateProcessInstanceById(){String processInstanceId = "70001";activitiService.activateProcessInstanceById(processInstanceId);}

8.8 激活、挂起流程定义

/*** 挂起流程定义** @param processDefineKey* @param cascade* @return*/
boolean suspendProcessDefineKey(String processDefineKey, boolean cascade);/*** 激活流程定义** @param processDefineKey* @param cascade* @return*/
boolean activateProcessDefinitionByKey(String processDefineKey, boolean cascade);@Overridepublic boolean suspendProcessDefineKey(String processDefineKey, boolean cascade) {repositoryService.suspendProcessDefinitionByKey(processDefineKey,cascade,new Date());return true;}@Overridepublic boolean activateProcessDefinitionByKey(String processDefineKey,boolean cascade){repositoryService.activateProcessDefinitionByKey(processDefineKey,cascade,new Date());return true;@Testpublic void suspendProcessDefineBykey(){String processDefineKey = "";boolean cascade = true;activitiService.suspendProcessDefineKey(processDefineKey,cascade);}

Activiti的使用技巧相关推荐

  1. agilebpm脑图_干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架

    干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 [干货]基于SpringBoot2开发的Activiti引擎流程管理项目脚手架 前言 在工作中,难免会遇到需要开发基于流程管 ...

  2. activiti 功能概述_子串功能概述

    activiti 功能概述 The requirement of data refactoring is very common and vital in data mining operations ...

  3. 工作流引擎 Activiti 保姆级教程

    大家好,我是老赵! 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进行传递文档. ...

  4. activiti源码解析重磅来袭

    activiti源码解析视频课程大概80课,会一直更新...,目前录制完毕的视频如下: 第2课:Activiti源码获取以及编译 第3课:流程引擎配置类的作用,配置方式.开关属性技巧.手动构建.Act ...

  5. Activiti工作流视频教程-基于Activiti5工作流实战企业协同OA办公系统

    Activiti工作流视频教程-基于Activiti5工作流实战企业协同OA办公系统(spring-data-jpa.uur前台组件) 一.Activiti工作流视频教程课程内容简介 在工作流方面,使 ...

  6. Activiti实战--书籍阅读导读

    Activiti实战 - 2015年机械工业出版社出版社出版闫洪磊编著图书 <Activiti实战 >立足于实践,不仅让读者知其然,全面掌握Activiti架构.功能.用法.技巧和最佳实践 ...

  7. keyshot怎么批量渲染_提高Keyshot逼真渲染的小技巧

    Keyshot是一个特别神奇的应用软件,但是,就像Photoshop一样,如果你不知道怎么使用它,那么再优秀的工具在你手中也什么都是了.这里我就告诉你一些制作优秀效果图的技巧以及如何使用这个神奇软件. ...

  8. Linux shell 学习笔记(6)— vim 编辑器使用方法及技巧

    1. 检查 vim 软件包 1.1 CentOS 发行版 $ alias vi alias vi='vim' $ $ which vim /usr/bin/vim $ $ ls -l /usr/bin ...

  9. Python 笔试面试及常用技巧 (1)

    1. 交换两个数字 In [66]: x, y = 1, 2In [67]: x Out[67]: 1In [68]: y Out[68]: 2 赋值的右侧形成了一个新的元组,左侧立即解析(unpac ...

最新文章

  1. ​MMIT冠军方案 | 用于行为识别的时间交错网络,商汤公开视频理解代码库
  2. VR是一场“大骗局”, 另一种声音
  3. Excel电子表格输入技巧大比拼
  4. postgresql中装gis插件_Postgresql 空间扩展需要Postgis插件
  5. Windows系统顽固型文件清除方法
  6. yarn资源参数配置
  7. Linux文件查找之findlocate
  8. 【渝粤题库】国家开放大学2021春1253C语言程序设计题目
  9. 多个containers 共用一个pvc_2020阜新PVC-UH市政管厂家-烟台塑胶
  10. 使用HP Vertica进行.NET编程
  11. RedHat Linux和Cent Linux日常运维之安全加固详细篇
  12. php简单富文本,JS简易版富文本编辑器实现代码
  13. Blazeds文档(二)-------Blazeds体系结构(一)【转载】
  14. 微信HOOK-微信逆向-微信公众号爬虫系统
  15. 阿里P9面试官分享:应聘阿里全流程
  16. c++ primer plus学习笔记(7)——类继承
  17. 电脑音箱什么牌子好,该如何选购?
  18. FineReport数据集
  19. Blogbus适用的日志发布工具【超级写手】
  20. CMS-by-Asp.net

热门文章

  1. 三图解决phpStorm部署ftp
  2. fatjar打包mysql_一个简单的解压ZIP Excl文件---gt;按时间读取Excle文件,通过Fat jar打成jar相对应的添加到mysql数据库中。 - 明月 - ITeye博客...
  3. angularjsl路由_AngularJS路由和模板
  4. 使用游标显示销售报表_协助报表开发之 MongoDB join mysql
  5. zynqpl端时钟_第十二章 ZYNQ-MIZ702 PS读写PL端BRAM
  6. easypoi导出word表格_拒绝加班,批量将word文档中的信息高效率提取出来存储到Excel中...
  7. java int数组写入文件中_Java程序将int数组写入文件
  8. windows CMD窗口换个标题 title命令
  9. 基于python3写的源码剖析_Python 极简插件系统 pluggy 源码剖析
  10. mysql pt-kill_percona-toolkit之pt-kill 杀掉mysql查询或连接的方法