10 API(5)任务参数与附件

 

1. 任务参数

 

1.1 基本数据类型参数

ACT_RU_VARIABLE

 

代码

package com.study.c10;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

import java.util.UUID;

public class VarTest {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        String taskId = UUID.randomUUID().toString();
        Task task = taskService.newTask(taskId);
        task.setName("test");

        taskService.saveTask(task);
        taskService.setVariable(taskId, "var1", "hello");
        System.out.println(taskService.getVariable(taskId,"var1"));
    }
}

控制台输出:

hello

ACT_RU_VARIABLE新增一条数据,可见值‘hello’保存于TEXT_字段中,

由本表的DDL可看出对于基本数据类型,仅需要保存于ACT_RU_VARIABLE表

CREATE TABLE `ACT_RU_VARIABLE` (
  `ID_` varchar(64) COLLATE utf8_bin NOT NULL,
  `REV_` int(11) DEFAULT NULL,
  `TYPE_` varchar(255) COLLATE utf8_bin NOT NULL,
  `NAME_` varchar(255) COLLATE utf8_bin NOT NULL,
  `EXECUTION_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `PROC_INST_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `TASK_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `BYTEARRAY_ID_` varchar(64) COLLATE utf8_bin DEFAULT NULL,
  `DOUBLE_` double DEFAULT NULL,
  `LONG_` bigint(20) DEFAULT NULL,
  `TEXT_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
  `TEXT2_` varchar(4000) COLLATE utf8_bin DEFAULT NULL,
  PRIMARY KEY (`ID_`),
  KEY `ACT_IDX_VARIABLE_TASK_ID` (`TASK_ID_`),
  KEY `ACT_FK_VAR_EXE` (`EXECUTION_ID_`),
  KEY `ACT_FK_VAR_PROCINST` (`PROC_INST_ID_`),
  KEY `ACT_FK_VAR_BYTEARRAY` (`BYTEARRAY_ID_`),
  CONSTRAINT `ACT_FK_VAR_BYTEARRAY` FOREIGN KEY (`BYTEARRAY_ID_`) REFERENCES `ACT_GE_BYTEARRAY` (`ID_`),
  CONSTRAINT `ACT_FK_VAR_EXE` FOREIGN KEY (`EXECUTION_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`),
  CONSTRAINT `ACT_FK_VAR_PROCINST` FOREIGN KEY (`PROC_INST_ID_`) REFERENCES `ACT_RU_EXECUTION` (`ID_`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

 

 

1.2 序列化参数

ACT_RU_VARIABLE + ACT_GE_BYTEARRAY

 

package com.study.c10;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.TaskService;
import org.activiti.engine.task.Task;

import java.util.UUID;

public class VarSerialTest {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        TaskService taskService = processEngine.getTaskService();
        String taskId = UUID.randomUUID().toString();
        Task task = taskService.newTask(taskId);
        task.setName("test");

        taskService.saveTask(task);

        Person person = new Person(1, "Kevin");
        taskService.setVariable(taskId, "object", person);
        System.out.println(taskService.getVariable(taskId,"object",Person.class));
    }
}

控制台输出:

Person{id=1, name='Kevin'}

ACT_RU_VARIABLE新增一条数据,注意到BYTEARRAY_ID_有值关联到ACT_GE_BYTEARRAY表

ACT_GE_BYTEARRAY表

 

2. 参数作用域

前面提及的setVariable方法设置的变量为全局变量。

2.1 本地参数

仅在当前任务中有效,在任务完成前都可以拿到参数,但是当流程流转到下一个节点(如task执行了complete完成),参数就拿不到了

API

taskService.setVariablesLocal(task.getId(),params);

package com.study.c10;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.util.HashMap;

public class VarLocal {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment().addClasspathResource("var_local.bpmn").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId()).singleResult();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        HashMap<String, Object> params = new HashMap<>();
        params.put("var1","test");
        taskService.setVariablesLocal(task.getId(),params);
        Object var = taskService.getVariable(task.getId(), "var1");
        System.out.println(task.getName() + " : " + var);
        //完成任务
        taskService.complete(task.getId());
        //再次查询
        task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        var = taskService.getVariableLocal(task.getId(), "var1");
        System.out.println(task.getName() + " : " + var);
    }
}

 控制台输出:

UserTask : test
UserTask : null

通过bpmn文件配置本地参数

  <process id="var_local" isClosed="false" isExecutable="true" processType="None">
    <dataObject id="personName" name="personName" itemSubjectRef="xsd:string">
      <extensionElements>
        <activiti:value>Kevin</activiti:value>
      </extensionElements>
    </dataObject>
    <startEvent id="_2" name="StartEvent"/>
    <userTask activiti:exclusive="true" id="_3" name="UserTask"/>
    <userTask activiti:exclusive="true" id="_4" name="UserTask"/>
    <endEvent id="_5" name="EndEvent"/>
    <sequenceFlow id="_6" sourceRef="_2" targetRef="_3"/>
    <sequenceFlow id="_7" sourceRef="_3" targetRef="_4"/>
    <sequenceFlow id="_8" sourceRef="_4" targetRef="_5"/>
  </process>

代码

package com.study.c10;

import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

public class VarLocal {

    public static void main(String[] args) {
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment().addClasspathResource("var_local.bpmn").deploy();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId(deployment.getId()).singleResult();
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
        TaskService taskService = processEngine.getTaskService();
        Task task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        Object var = taskService.getVariable(task.getId(), "personName");
        System.out.println(task.getName() + " : " + var);
        //完成任务
        taskService.complete(task.getId());
        //再次查询
        task = taskService.createTaskQuery().processInstanceId(processInstance.getId()).singleResult();
        var = taskService.getVariableLocal(task.getId(), "personName");
        System.out.println(task.getName() + " : " + var);
    }
}

控制台输出:

UserTask : Kevin
UserTask : null

2.2 全局参数

 

3. 任务附件管理

在实际生活中,许多的流程都会带上一些任务相关的附件,例如报销流程有可能需要附上发票的单据、奖惩流程有可能会附上相关的说明文件,为此,TaskService中提供了附件管理的API,通过调用这些API,可以对任务附件进行创建、删除和查询的操作。

Activiti中使用附件表(ACT_HI_ATTACHMENT)保存任务附件数据,与该对应的实体类为AttachmentEntityImpl。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值