一、安装
至于Activiti的安装,这里不多少了,推荐篇文章,可以参考一下。
二、实例
上篇博客说了,Activiti的整个流程,我们按着这个流程进行就可以了:
1、通过activiti.cfg.xml来拿到数据库连接的信息,创建一个默认的流程引擎
2、流程引擎获取getRepositoryService,然后创建createDeployment然后加载bpmn文件和png图片,部署一个流程
3、部署好流程之后,通过流程引擎获取getRuntimeService,然后启动流程实例
4、如果需要其他的服务,通过流程引擎获取对应的服务接口,调用对应的接口方法即可!
整体结构:
流程文件leavel.bpmn
具体代码:
1、通过activiti.cfg.xml来拿到数据库连接的信息,创建一个默认的流程引擎
ProcessEngine pe=ProcessEngines.getDefaultProcessEngine();
public synchronized static void init() {
if (!isInitialized) {
if(processEngines == null) {
// Create new map to store process-engines if current map is null
processEngines = new HashMap<String, ProcessEngine>();
}
ClassLoader classLoader = ReflectUtil.getClassLoader();
Enumeration<URL> resources = null;
try {
<span style="color:#ff0000;"> resources = classLoader.getResources("activiti.cfg.xml");</span>
} catch (IOException e) {
throw new ActivitiIllegalArgumentException("problem retrieving activiti.cfg.xml resources on the classpath: "+System.getProperty("java.class.path"), e);
}
// Remove duplicated configuration URL's using set. Some classloaders may return identical URL's twice, causing duplicate startups
Set<URL> configUrls = new HashSet<URL>();
while (resources.hasMoreElements()) {
configUrls.add( resources.nextElement() );
}
for (Iterator<URL> iterator = configUrls.iterator(); iterator.hasNext();) {
URL resource = iterator.next();
log.info("Initializing process engine using configuration '{}'", resource.toString());
initProcessEnginFromResource(resource);
}
try {
resources = classLoader.getResources("activiti-context.xml");
} catch (IOException e) {
throw new ActivitiIllegalArgumentException("problem retrieving activiti-context.xml resources on the classpath: "+System.getProperty("java.class.path"), e);
}
while (resources.hasMoreElements()) {
URL resource = resources.nextElement();
log.info("Initializing process engine using Spring configuration '{}'", resource.toString());
initProcessEngineFromSpringResource(resource);
}
isInitialized = true;
} else {
log.info("Process engines already initialized");
}
}
2、流程引擎获取getRepositoryService,然后创建createDeployment然后加载bpmn文件和png图片,部署一个流程
//部署一个流程
@Test
public void test01(){
Deployment deploment=pe.getRepositoryService().createDeployment()
.addClasspathResource("diagrams/leavel.bpmn")
.addClasspathResource("diagrams/leavel.png")
.name("请假完整实例")
.deploy();
System.out.println(deploment.getId()+"---"+deploment.getName());
}
3、部署好流程之后,通过流程引擎获取getRuntimeService,然后启动流程实例
//通过流程引擎启动一个流程实例
@Test
public void test02(){
ProcessInstance pi=pe.getRuntimeService().startProcessInstanceByKey("Leavel");
System.out.println(pi.getId()+"---"+pi.getProcessInstanceId());
}
4、如果需要其他的服务,通过流程引擎获取对应的服务接口,调用对应的接口方法即可!
查询任务:
//查询任务
@Test
public void test03(){
//查询任务
List<Task> tasks=pe.getTaskService().createTaskQuery().taskAssignee("leilei").list();
if(tasks!=null && tasks.size()>0){
for (Task task : tasks) {
System.out.println("执行人: "+task.getAssignee()+"---任务Id: "+task.getId()+"---任务名称"+task.getName());
}
}
//获取运行时的流程实例信息
List<ProcessInstance> processInstances=pe.getRuntimeService().createProcessInstanceQuery().list();
if(processInstances!=null&&processInstances.size()>0){
for (ProcessInstance processInstance : processInstances) {
System.out.println(processInstance.getId()+""+processInstance.getProcessInstanceId());
}
}
List<ProcessDefinition> processDefinitions=pe.getRepositoryService().createProcessDefinitionQuery().list();
if(processDefinitions!=null&&processDefinitions.size()>0)
{for (ProcessDefinition processDefinition : processDefinitions) {
System.out.println(processDefinition.getCategory()+" 流程部署的ID"+processDefinition.getDeploymentId()+" 部署流程的key "+processDefinition.getKey()+" 资源名称:"+processDefinition.getResourceName()+" 版本:"+processDefinition.getVersion());
}
}
}
5、完成个人任务
<span style="font-size:18px;"> //办理任务,上一个任务完成,流程会自动转移到下一个
@Test
public void testCompelete(){
pe.getTaskService().complete("204");
List<Task> tasks=pe.getTaskService().createTaskQuery().taskAssignee("xiaoqiang").list();
if(tasks!=null&&tasks.size()>0){
for (Task task : tasks) {
System.out.println("任务执行人"+task.getAssignee()+"---流程实例ID"+task.getProcessInstanceId()+"---流程定义ID"+task.getProcessDefinitionId());
}
}
}</span>
三、小结
通过实例可以看出,activiti的核心是通过流程引擎processEngine获取对应的服务,进行部署流程,启动流程,任务节点操作任务,每个节点完成任务之后,任务流程结束,并将其中涉及到的数据‘自动化’持久化到数据中去!