【Activiti学习之二】Activiti API(一)
环境
JDK 1.8
MySQL 5.6
Tomcat 7
Eclipse-Luna
activiti 6.0
一、Activiti数据查询
准备数据:
package com.wjy.act; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class SaveGroup { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); for(int i = 0; i < 10; i++) { Group group = is.newGroup(String.valueOf(i)); group.setName("Group_" + i); group.setType("TYPE_" + i); is.saveGroup(group);//保存到表act_id_group } engine.close(); System.exit(0); } }
list 查询多条和count 数量统计:
package com.wjy.act; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class TestList { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //测试list查询 List<Group> groups = is.createGroupQuery().list(); for(Group g : groups) { System.out.println(g.getId() + "---" + g.getName() + "---" + g.getType()); } //测试 count long size = is.createGroupQuery().count(); System.out.println(size); } }
listPage 分页查询:
package com.wjy.act; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class TestListPage { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //分页查询 listPage List<Group> groups = is.createGroupQuery().listPage(1, 5); for(Group g : groups) { System.out.println(g.getId() + "---" + g.getName() + "---" + g.getType()); } } }
singleResult 查询单条
package com.wjy.act; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class TestSingle { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //测试singleResult Group g = is.createGroupQuery().groupName("Group_0").singleResult(); System.out.println(g.getId()); } }
asc 升序和desc 降序:
package com.wjy.act; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class TestSort { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //测试降序 升序 需要根据字段orderby //多字段排序 orderby之后都要跟上asc() 或desc() //is.createGroupQuery().orderByGroupId().asc().orderByGroupName().asc().list(); List<Group> groups = is.createGroupQuery().orderByGroupId().desc().orderByGroupName().asc().list(); for(Group g : groups) { System.out.println(g.getId()); } } }
按照字段条件查询:
package com.wjy.act; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class FieldQuery { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //按照字段条件查询 List<Group> groups = is.createGroupQuery().groupName("Group_1").groupType("TYPE_1").list(); for(Group g : groups) { System.out.println(g.getId()); } } }
支持原生sql查询:
package com.wjy.act; import java.util.List; import org.activiti.engine.IdentityService; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.identity.Group; public class NativeQuery { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); IdentityService is = engine.getIdentityService(); //支持原生sql语句查询 List<Group> groups = is.createNativeGroupQuery() .sql("SELECT * FROM ACT_ID_GROUP where NAME_ = #{name}") .parameter("name", "Group_2").list(); for (Group g : groups) { System.out.println(g.getId()); } } }
二、流程文件部署
1、DeploymentBuilder对象
方法addClasspathResource:
package com.wjy.deploy; import java.io.InputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.DeploymentBuilder; public class TextQuery { public static void main(String[] args) throws Exception { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 存储服务 RepositoryService rs = engine.getRepositoryService(); DeploymentBuilder builder = rs.createDeployment(); builder.addClasspathResource("my_text.txt"); Deployment dep = builder.deploy(); // 数据查询 InputStream is = rs.getResourceAsStream(dep.getId(), "my_text.txt"); int count = is.available(); byte[] contents = new byte[count]; is.read(contents); String result = new String(contents); //输入结果 System.out.println(result); } }
方法addInputStream:
package com.wjy.deploy; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import javax.imageio.ImageIO; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; public class ImageQuery { public static void main(String[] args) throws Exception { // 创建流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 得到流程存储服务对象 RepositoryService repositoryService = engine.getRepositoryService(); // 部署一份流程文件与相应的流程图文件 Deployment dep = repositoryService.createDeployment().addClasspathResource("gen.bpmn").deploy(); // 查询流程定义 ProcessDefinition def = repositoryService.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult(); // 查询资源文件 InputStream is = repositoryService.getProcessDiagram(def.getId()); // 将输入流转换为图片对象 BufferedImage image = ImageIO.read(is); // 保存为图片文件 File file = new File("resource/result.png"); if (!file.exists()) file.createNewFile(); FileOutputStream fos = new FileOutputStream(file); ImageIO.write(image, "png", fos); fos.close(); is.close(); } }
方法addZipInputStream:
package com.wjy.deploy; import java.io.File; import java.io.FileInputStream; import java.util.zip.ZipInputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.DeploymentBuilder; public class ZipTest { public static void main(String[] args) throws Exception { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 存储服务 RepositoryService rs = engine.getRepositoryService(); DeploymentBuilder builder = rs.createDeployment(); FileInputStream fis = new FileInputStream(new File("resource/datas.zip")); ZipInputStream zis = new ZipInputStream(fis); builder.addZipInputStream(zis); builder.deploy(); } }
方法addBpmnModel:
package com.wjy.deploy; import org.activiti.bpmn.model.BpmnModel; import org.activiti.bpmn.model.EndEvent; import org.activiti.bpmn.model.SequenceFlow; import org.activiti.bpmn.model.StartEvent; import org.activiti.bpmn.model.UserTask; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.DeploymentBuilder; public class BpmnTest { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 存储服务 RepositoryService rs = engine.getRepositoryService(); DeploymentBuilder builder = rs.createDeployment(); builder.addBpmnModel("My Process", createProcessModel()); builder.deploy(); } private static BpmnModel createProcessModel() { // 创建BPMN模型对象 BpmnModel model = new BpmnModel(); // 创建一个流程定义 org.activiti.bpmn.model.Process process = new org.activiti.bpmn.model.Process(); model.addProcess(process); process.setId("myProcess"); process.setName("My Process"); // 开始事件 StartEvent startEvent = new StartEvent(); startEvent.setId("startEvent"); process.addFlowElement(startEvent); // 用户任务 UserTask userTask = new UserTask(); userTask.setName("User Task"); userTask.setId("userTask"); process.addFlowElement(userTask); // 结束事件 EndEvent endEvent = new EndEvent(); endEvent.setId("endEvent"); process.addFlowElement(endEvent); // 添加流程顺序 process.addFlowElement(new SequenceFlow("startEvent", "userTask")); process.addFlowElement(new SequenceFlow("userTask", "endEvent")); return model; } }
方法addString和addBytes:略
上面的方法是加载流程方法,另外方法deploy是将加载的流程实现部署,返回对象Deployment,部署记录记录到表表:act_re_deployment,流程则记录到表:act_ge_bytearray。
2、部署验证
默认会进行格式和流程定义验证
格式验证:
package com.wjy.deploy; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.DeploymentBuilder; public class SchemaError { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 存储服务 RepositoryService rs = engine.getRepositoryService(); DeploymentBuilder builder = rs.createDeployment(); //schema_error.bpmn 格式有问题 比如说在里面加入了无效标签<abc>angus</abc> builder.addClasspathResource("error/schema_error.bpmn"); //关闭格式验证 disableSchemaValidation //builder.disableSchemaValidation(); builder.deploy(); } }
流程验证:
package com.wjy.deploy; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.DeploymentBuilder; public class BpmnError { public static void main(String[] args) { ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 存储服务 RepositoryService rs = engine.getRepositoryService(); DeploymentBuilder builder = rs.createDeployment(); //bpmn_error.bpmn 流程有问题 比如说有两个开始节点 builder.addClasspathResource("error/bpmn_error.bpmn"); //关闭流程验证 disableBpmnValidation //builder.disableBpmnValidation(); builder.deploy(); } }
3、查询部署资源
package com.wjy.deploy; import java.io.InputStream; import org.activiti.engine.ProcessEngine; import org.activiti.engine.ProcessEngines; import org.activiti.engine.RepositoryService; import org.activiti.engine.repository.Deployment; import org.activiti.engine.repository.ProcessDefinition; public class BpmnQuery { public static void main(String[] args) throws Exception { // 创建流程引擎 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 得到流程存储服务对象 RepositoryService repositoryService = engine.getRepositoryService(); // 部署一份流程文件 Deployment dep = repositoryService.createDeployment().addClasspathResource("gen.bpmn").deploy(); // 查询流程定义 //查询流程定义实体 ProcessDefinition def = repositoryService.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult(); // 查询资源文件 InputStream is = repositoryService.getProcessModel(def.getId()); // 读取输入流 int count = is.available(); byte[] contents = new byte[count]; is.read(contents); String result = new String(contents); //输入输出结果 System.out.println(result); } }
查询流程图参考上面方法addInputStream。
4、删除部署资源
repositoryService.deleteDeployment(String deploymentId, boolean cascade)
(1)不管是否指定级联,都会删除部署相关的身份数据(act_id*)、流程定义数据(act_re_procdef)、流程资源(act_ge_bytearray)与部署数据(act_re_deployment)。
(2)如果设置为级联删除,则会将运行的流程实例、流程任务以及流程实例的历史数据删除。
(3)如果不级联删除,但是存在运行时数据,例如还有流程实例(act_ru*),就会删除失败。
学习技术不是用来写HelloWorld和Demo的,而是要用来解决线上系统的真实问题的.