上篇我们通过eclipes进行了流程图的绘制,接下了我们使用idea进行流程的开发。并最终将我们的项目打包在jar进行测验,好了,话不多说,我们开始吧~!
- 引入我们所需要的pom文件,dependencies中添加我们用到的依赖,activiti6.0.0
<!--activiti依赖-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>6.0.0</version>
</dependency>
<!--junit 测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--logback-->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!--guava组件-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>23.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.196</version>
</dependency>
2. 下来我们编写一个main入口,主要为程序执行的方法, 一个activiti主要有这几步进行,首先是创建流程引擎,部署流程定义文件、启动运行的流程,下来执行我们的流程任务。
public static void main(String[] args) throws ParseException {
LOGGER.info("程序启动成功");
//创建流程引擎
ProcessEngine processEngine = getProcessEngine();
//部署流程定义文件
ProcessDefinition processDefinition = deployment(processEngine);
//启动运行流程
ProcessInstance processInstance = getProcessInstance(processEngine, processDefinition);
//处理流程任务
processTask(processEngine, processInstance);
LOGGER.info("程序结束");
}
创建流程引擎,使用activiti默认的方式创建ProcessEngineConfiguration,
private static ProcessEngine getProcessEngine() {
//activiti默认的方式创建ProcessEngineConfiguration
ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
ProcessEngine processEngine = cfg.buildProcessEngine();
String name = processEngine.getName();
String version = processEngine.VERSION;
LOGGER.info("流程引擎名称【{}】,版本为【{}】",name,version);
return processEngine;
}
部署我们的流程文件,先将上编中我们绘制好的流程图,复制到idea的resources目录下,重命名为.xml文件。
先通过引擎信息获取repoositoryService,再引入我们的xml流程,进行部署,再根据部署的deploymantID获取流程定义的对象。
private static ProcessDefinition deployment(ProcessEngine processEngine) {
RepositoryService repositoryService = processEngine.getRepositoryService();
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addClasspathResource("activiti-status.bpmn20.xml");
Deployment deployment = deploymentBuilder.deploy();
String id = deployment.getId();
//获取流程定义对像
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(id)
.singleResult();
String processDefinitionId = processDefinition.getId();
String processDefinitionName = processDefinition.getName();
LOGGER.info("流程定义名称为【{}】,id为【{}】",processDefinitionName,processDefinitionId);
return processDefinition;
}
启动流程,先通过引擎,获取运行时对象runtimeServie,再通过流程定义的id启动流程。
private static ProcessInstance getProcessInstance(ProcessEngine processEngine, ProcessDefinition processDefinition) {
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
LOGGER.info("启动流程【{}】",processInstance.getProcessDefinitionKey());
return processInstance;
}
最后执行处理任务
private static void processTask(ProcessEngine processEngine, ProcessInstance processInstance) throws ParseException {
Scanner scanner = new Scanner(System.in);
while (processInstance != null && !processInstance.isEnded()){
TaskService taskService = processEngine.getTaskService();
List<Task> list = taskService.createTaskQuery().list();
LOGGER.info("待处理任务数为【{}】",list.size());
for (Task task:list) {
LOGGER.info("待处理的任务【{}】",task.getName());
FormService formService = processEngine.getFormService();
TaskFormData taskFormData = formService.getTaskFormData(task.getId());
List<FormProperty> formProperties = taskFormData.getFormProperties();
Map<String, Object> variables = getStringObjectMap(scanner, formProperties);
//提交表单
taskService.complete(task.getId(),variables);
//提交后更新流程实例
processInstance = processEngine.getRuntimeService()
.createProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.singleResult();
}
}
scanner.close();
}
private static Map<String, Object> getStringObjectMap(Scanner scanner, List<FormProperty> formProperties) throws ParseException {
Map<String,Object> variables = Maps.newHashMap();
String line = null;
for (FormProperty property : formProperties){
//判断用户输入类型
if(StringFormType.class.isInstance(property.getType())){
LOGGER.info("请输入【{}】?",property.getName());
line = scanner.nextLine();
LOGGER.info("您输入的内容是【{}】",line);
variables.put(property.getId(),line);
}else{
LOGGER.info("请输入时间,格式为yyyy-MM-dd【{}】?",property.getName());
line = scanner.nextLine();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date parse = sdf.parse(line);
LOGGER.info("您输入的内容是【{}】",line);
variables.put(property.getId(),parse);
}
}
return variables;
}
这样我们的简单 的流程就处理完成了,具体代码可以在github上查看噢。