Activiti入门教程七(玩转存储引擎API)


     在Activiti中有很多的组件,说组件就有点高大上了,其实Activiti在设计上,为了把数据库划分,所以才分为这么多类。比如后天有存储用户的,那么我就设计一个用户组件,用来管理用户的增删改查。相应的还有身份组件、存储引擎组件等等,那么本篇博客就来玩一下repositoryService流程存储组件的API



     DeploymentBuilder操作

     在开发中,会涉及到各种的流程操作,所以必须要把这些流程操作,以图片或者以Activiti自己的格式.bpmn的形似存储起来吧!这就是所谓的流程文件部署。看一下Activiti为我们提供了一个方便添加的接口DeploymentBuilder。



public interface DeploymentBuilder {

  //以输入流的形式保存到数据库中

 DeploymentBuilder addInputStream(String resourceName, InputStream inputStream);

 //以路径的形式,保存classpath下面的资源

 DeploymentBuilder addClasspathResource(String resource);

 //添加字符串资源,text为资源的内容

 DeploymentBuilder addString(String resourceName, String text);

 //添加压缩包的资源,最终会把压缩包中的全部内容全部添加其中

 DeploymentBuilder addZipInputStream(ZipInputStream zipInputStream);

 //修改部署资源文件的名称

 DeploymentBuilder name(String name);

   //添加资源文件的类型

 DeploymentBuilder category(String category);

 //过滤重复部署,如果部署的资源内容和资源名称一致的话,就不会再部署

 DeploymentBuilder enableDuplicateFiltering();

 //改变资源的激活状态,默认为激活状态

 DeploymentBuilder activateProcessDefinitionsOn(Date date);

 //最后资源部署

 Deployment deploy(); 

}


     上面就是有关部署资源的一些方法,百闻不如一见,多多实践一下,下面小编准备了所有的方法demo


public class AddInputStream {

	public static void main(String[] args) throws Exception {

		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 第一个资源输入流
		InputStream is1 = new FileInputStream(new File(
				"resource/artifact/flow_inputstream1.png"));
		// 第二个资源输入流
		InputStream is2 = new FileInputStream(new File(
				"resource/artifact/flow_inputstream1.png"));
		// 创建DeploymentBuilder实例
		DeploymentBuilder builder = repositoryService.createDeployment();
		// 为DeploymentBuilder添加资源输入流
		builder.addInputStream("inputA", is1);
		builder.addInputStream("inputB", is2);
		builder.addClasspathResource("artifact/classpath.png");
		// 添加String资源
		builder.addString("test", "this is string method");

		builder.name("hello");
		// 获取zip文件的输入流
		FileInputStream fis = new FileInputStream(new File(
				"resource/artifact/ZipInputStream.zip"));
		// 读取zip文件,创建ZipInputStream对象
		ZipInputStream zi = new ZipInputStream(fis);
		// 添加Zip压缩包资源
		builder.addZipInputStream(zi);
		// 执行部署方法
		builder.deploy();
	}

}


     在DeploymentBuilder中,我们看到了一个激活状态的设置,那么如何终止或者激活流程呢?repositoryService为我们提供了方法,如下


//根据流程定义ID终止流程

void suspendProcessDefinitionById(String processDefinitionId);

//根据流程KEY来终止流程

 void suspendProcessDefinitionByKey(String processDefinitionKey);

//根据流程定义ID来激活流程

void activateProcessDefinitionById(String processDefinitionId);

//根据流程定义key来激活流程

 void activateProcessDefinitionByKey(String processDefinitionKey);


ProcessDefinition操作

 在Activit中,在添加资源的时候,首先对资源文件进行解析,如果后缀是.xml或者.bpmn的文件,均会被看作是描述文件,因此在部署的时候,不仅仅保存资源文件,还会向数据库中添加资源文件的描述信息。ProcessDefinition该接口就是资源文件信息描述实体。

public interface ProcessDefinition {

 String getId();

 String getCategory();

 String getName();

 String getKey();

 String getDescription();

 int getVersion();

 String getResourceName();

 String getDeploymentId();

 String getDiagramResourceName();

 boolean hasStartFormKey();

 boolean isSuspended();

}



     如下面的例子,部署.bpmn文件后,就可以获得资源文件的描述信息

public class DeployDiagram {

	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();		
		//部署流程描述文件与流程图
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/diagram.bpmn")
				.addClasspathResource("bpmn/diagram.png")
				.addClasspathResource("bpmn/diagram.vacationProcess.png")
				.deploy();
		
		//查询流程定义实体
		ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		// 输出结果为 bpmn/diagram.vacationProcess.png
		System.out.println(def.getDiagramResourceName());
	}

}



     RepositoryService操作

     上面说了很多,下面来看一下厉害人物,看看这个东东里面都有哪些操作


public interface RepositoryService {
		//关于流程的操作API
		  DeploymentBuilder createDeployment();
		  void deleteDeployment(String deploymentId);
		  void deleteDeploymentCascade(String deploymentId);
		  void deleteDeployment(String deploymentId, boolean cascade);
		  List getDeploymentResourceNames(String deploymentId);
		  InputStream getResourceAsStream(String deploymentId, String resourceName);
		  ProcessDefinitionQuery createProcessDefinitionQuery();
		  NativeProcessDefinitionQuery createNativeProcessDefinitionQuery();
		  DeploymentQuery createDeploymentQuery();
		  NativeDeploymentQuery createNativeDeploymentQuery();
		  
		  //激活终止流程的API操作
		  void suspendProcessDefinitionById(String processDefinitionId);
		  void suspendProcessDefinitionById(String processDefinitionId, boolean suspendProcessInstances, Date suspensionDate);	  
		  void suspendProcessDefinitionByKey(String processDefinitionKey);
		  void suspendProcessDefinitionByKey(String processDefinitionKey, boolean suspendProcessInstances, Date suspensionDate);
		  void activateProcessDefinitionById(String processDefinitionId);
		  void activateProcessDefinitionById(String processDefinitionId, boolean activateProcessInstances, Date activationDate);
		  void activateProcessDefinitionByKey(String processDefinitionKey);
		  void activateProcessDefinitionByKey(String processDefinitionKey, boolean activateProcessInstances,  Date activationDate);
		  void setProcessDefinitionCategory(String processDefinitionId, String category);
		 
		  //查询流程资源的操作
		  InputStream getProcessModel(String processDefinitionId);
		  InputStream getProcessDiagram(String processDefinitionId);
		  ProcessDefinition getProcessDefinition(String processDefinitionId);  
		  BpmnModel getBpmnModel(String processDefinitionId);
		  DiagramLayout getProcessDiagramLayout(String processDefinitionId);
		  
		  //流程定义权限的操作
		  void addCandidateStarterUser(String processDefinitionId, String userId);
		  void addCandidateStarterGroup(String processDefinitionId, String groupId);
		  void deleteCandidateStarterUser(String processDefinitionId, String userId);
		  void deleteCandidateStarterGroup(String processDefinitionId, String groupId);		

		}


     上面基本上就是该类的全部操作,我把上面的方法大致划分了三类,下面来分别说一下

     流程定义权限的操作

     我们已经把流程定义好了,那么也得涉及到权限操作吧!如何给用户或者用户组来分别权限呢,用的就是上面的API,由于是多对多的关系,涉及到了第三张表act_ru_identitylink,把资源和用户ID捆绑到一块


public class UserCandidate {

	public static void main(String[] args) {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务实例
		RepositoryService repositoryService = engine.getRepositoryService();
		// 得到身份服务组件
		IdentityService identityService = engine.getIdentityService();
		//部署流程描述文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/candidateUser.bpmn").deploy();
		
		//查询流程定义实体
		ProcessDefinition def = repositoryService.createProcessDefinitionQuery()
				.deploymentId(dep.getId()).singleResult();
		// 写入用户数据
		creatUser(identityService, "user1", "angus", "young", "[email protected]", "123");
		creatUser(identityService, "user2", "angus2", "young2", "[email protected]", "123");
		creatUser(identityService, "user3", "angus3", "young3", "[email protected]", "123");
		// 设置用户组与流程定义的关系(设置权限)
		repositoryService.addCandidateStarterUser(def.getId(), "user1");
		repositoryService.addCandidateStarterUser(def.getId(), "user2");
	}

	//创建用户方法
	static void creatUser(IdentityService identityService, String id, String first, String last, String email, String passwd) {
		// 使用newUser方法创建User实例
		User user = identityService.newUser(id);
		// 设置用户的各个属性
		user.setFirstName(first);
		user.setLastName(last);
		user.setEmail(email);
		user.setPassword(passwd);
		// 使用saveUser方法保存用户
		identityService.saveUser(user);
	}
}


     RepositoryService数据查询和删除

    在本篇博客开头,就已经介绍了将流程描述文件、流程资源保存到数据库中,接下来就是如何来管理这些资源。


 //根据部署ID和资源名称查询部署资源

  InputStream getResourceAsStream(String deploymentId, String resourceName);

//根据流程定义id,查询资源文件信息

 InputStream getProcessModel(String processDefinitionId);

//根据流程定义id查询,查询流程图信息

InputStream getProcessDiagram(String processDefinitionId);

//根据部署id查询所有资源的信息

 List getDeploymentResourceNames(String deploymentId);


     

     下面就以其中一个方法,看一下例子


public class GetProcessDiagram {

	public static void main(String[] args) throws Exception {
		// 创建流程引擎
		ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
		// 得到流程存储服务对象
		RepositoryService repositoryService = engine.getRepositoryService();
		// 部署一份流程文件与相应的流程图文件
		Deployment dep = repositoryService.createDeployment()
				.addClasspathResource("bpmn/getProcessDiagram.bpmn")
				.addClasspathResource("bpmn/getProcessDiagram.png").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/artifact/result.png");
		if (!file.exists()) file.createNewFile();
		FileOutputStream fos = new FileOutputStream(file);
		ImageIO.write(image, "png", fos);
		fos.close();
		is.close();
	}

}



     DeploymentQuery查询对象

 关于部署的所有查询操作,都与该接口有关,上篇博客已经介绍过了,内容都是一样的,就不再多说了




你可能感兴趣的:(Activiti入门教程)