【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld

本文介绍以Eclipse和IDEA创建Activiti6.0第一个程序Helloworld,文章比较长,请耐心阅读。

为了方便读者练习,在本文中配有福利,请自行查取。

程序的运行效果如下所示:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第1张图片

一、工具

Eclipse辅助画流程图,创建流程定义文件

IDEA创建流程项目。

二、Eclipse中创建流程定义文件(简单点说就是画流程图)(***)

1.eclipse 中创建maven工程activiti-test,我们需要添加一个diagram的package,用于存放流程的流程定义文件。

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第2张图片

2.在diagram中新建Activiti Diagram文件,并取名为second_approve.bpmn

在Eclipse中添加activiti插件:Help-->Install new SoftWare-->点击Add-->

Name:Activiti BPMN 2.0 designer

Locatioin: http://activiti.org/designer/update/

(安装之前可能需要挂VPN)

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第3张图片

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第4张图片

 

3.画流程图 ***(注:表单的每个元素都有基本信息Id和Name,三个方框要有对应的表单,第一个表单内容为申请人姓名,申请时间,申请信息和是否确认申请,后面两个表单为审批结果和备注,,三个网关后的两条线要有逻辑表达式)

画流程图如下所示:

 

 【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第5张图片

4.设置流程图的信息(点击空白处设置即可)

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第6张图片

5.给每个人工任务添加信息

填写审批信息元素:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第7张图片

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第8张图片

 

主管与人事审批信息:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第9张图片

 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第10张图片

有两个取消事件,一个可以取为endEvent(结束),还有一个可以取为endEventCancel(取消)

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第11张图片

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第12张图片

6.填写表单信息

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第13张图片

三个表单的信息:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第14张图片

 【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第15张图片

 【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第16张图片

7.填写每一个逻辑

填写审批信息-->确认提交的表达式:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第17张图片

填写审批信息-->取消提交的表达式:

 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第18张图片

另两个逻辑同理即可,只需要修改EL表达式的ID号即可

三、IDEA中创建Hello-world项目(*****)

8.IDEA中创建Maven工程

new project

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第19张图片【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第20张图片

GroupId可以理解为组织结构的编码,一般与包名类似;ArtifactId为项目名;Version默认即可;三者组成一个GAV三维的坐标系。

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第21张图片

 创建好的项目的目录结构为:

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第22张图片

9.在activiti6-helloworld中手动添加常用的依赖(添加依赖先检查IDEA是否安装maven,否则添加后会报错)

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第23张图片

 完整的依赖如下:


        
        
            org.activiti
            activiti-engine
            6.0.0
        
        
        
            junit
            junit
            4.11
            test
        
        
        
            ch.qos.logback
            logback-classic
            1.1.11
        
        
        
            com.google.guava
            guava
            23.0
        
        
        
            com.h2database
            h2
            1.3.176
        
    

10.在java文件夹中创建包结构package 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第24张图片

创建main方法 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第25张图片

11.编写main方法中的流程逻辑的代码

public class DemoMain {
    private static final Logger LOGGER = LoggerFactory.getLogger(DemoMain.class);
    public static void main(String[] args) {
        LOGGER.info("启动我们的程序");
        //1.创建流程引擎
        ProcessEngineConfiguration cfg= ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
        ProcessEngine processEngine=cfg.buildProcessEngine();
        String name=processEngine.getName();
        String version=processEngine.VERSION;
        LOGGER.info("流程引擎名称{},版本{}",name,version);
        //2.部署流程定义文件
        //3.启动运行流程
        //4.处理流程任务
        LOGGER.info("结束我们的程序");
    }
}

12.修改日志显示级别

运行时,提示了很多信息,可以拷贝logback.xml到资源文件夹resources中,plain为只显示我们想要的信息,拷贝进去后重新运行即可。



    
    
    
    
    
    
    
        
            ${plain}
            ${encoding}
        
    


    
    
        ${log.dir}/file.log
        
            ${log.dir}/file.%d{yyyy-MM-dd}.log
            30
        
        
            ${std}
            ${encoding}
        
    
    
        
    
    
        
    
    
        
        
    

13.部署流程定义文件

eclipse中的second_approve.bpmn文件拷贝到resources中,--->另外重命名,生成一个second_approve.bpmn20.xml文件

编写代码:

//部署流程定义文件
//获取service
RepositoryService repositoryService = processEngine.getRepositoryService();
//通过repositoryService获取一个builder
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
deploymentBuilder.addClasspathResource("second_approve.bpmn20.xml");
Deployment deployment = deploymentBuilder.deploy();
String deploymentId=deployment.getId();
ProcessDefinition processDefinition=repositoryService.createProcessDefinitionQuery()
        .deploymentId(deploymentId)
        .singleResult();
LOGGER.info("流程定义文件{},流程ID{}",processDefinition.getName(),processDefinition.getId());

 14.启动运行流程

//启动运行时对象
RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
LOGGER.info("启动流程[{}]",processInstance.getProcessDefinitionKey());
//处理流程任务
TaskService taskService = processEngine.getTaskService();
List list = taskService.createTaskQuery().list();
for(Task task:list){
    LOGGER.info("待处理任务[{}]",task.getName());
}
LOGGER.info("待处理任务数量[{}]",list.size());

 15.抽取方法

 将代码抽取为方法,选中代码,右键Refactor->Extract->Method,抽取后的效果:

//创建流程引擎
ProcessEngine processEngine=getProcessEngine();
//部署流程定义文件
ProcessDefinition processDefinition=getProcessDefinition(processEngine);
//启动运行流程//启动运行时对象
ProcessInstance processInstance=getProcessInstance(processEngine,processDefinition);

 16.最终代码

DemoMain.java(此处以未提取方法为例,便于查看业务过程,分享的文件中为提取方法后的代码)

public class Demo {
    private static final Logger LOGGER = LoggerFactory.getLogger(Demo.class);

    public static void main(String[] args) {
        //创建流程引擎
        ProcessEngineConfiguration cfg = ProcessEngineConfiguration.createStandaloneInMemProcessEngineConfiguration();
        ProcessEngine processEngine = cfg.buildProcessEngine();
        LOGGER.info("启动程序");
        LOGGER.info("流程引擎版本:[{}]", processEngine.VERSION);

        //部署流程定义文件
        RepositoryService repositoryService = processEngine.getRepositoryService();
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
        deploymentBuilder.addClasspathResource("second_approve.bpmn20.xml");
        Deployment deployment = deploymentBuilder.deploy();
        String deploymentId = deployment.getId();
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploymentId).singleResult();
        LOGGER.info("流程定义文件 [{}], 流程ID [{}]", processDefinition.getName(), processDefinition.getId());

        //启动运行流程
        RuntimeService runtimeService = processEngine.getRuntimeService();
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
        LOGGER.info("启动流程 [{}]", processInstance.getProcessDefinitionKey());

        //处理流程任务
        Scanner scanner = new Scanner(System.in);

        while (processInstance != null && !processInstance.isEnded()) {
            TaskService taskService = processEngine.getTaskService();
            List list = taskService.createTaskQuery().list();
            LOGGER.info("待处理任务数量 [{}]", list.size());
            for (Task task : list) {
                LOGGER.info("待处理任务 [{}]", task.getName());
                Map variables = getMap(processEngine, scanner, task);
                taskService.complete(task.getId(), variables);
                processInstance = processEngine.getRuntimeService().createProcessInstanceQuery().processInstanceId(processInstance.getId()).singleResult();
            }
        }

        scanner.close();
        LOGGER.info("关闭程序");
    }

    //getMap()方法
    private static Map getMap(ProcessEngine processEngine, Scanner scanner, Task task){
        Map variables = new HashMap<>();
        FormService formService = processEngine.getFormService();
        TaskFormData taskFormData = formService.getTaskFormData(task.getId());
        List formProperties = taskFormData.getFormProperties();
        for(FormProperty property : formProperties){
            String line = null;
            if(StringFormType.class.isInstance(property.getType())){
                LOGGER.info("请输入 [{}] ?", property.getName());
                line = scanner.nextLine();
                variables.put(property.getId(), line);
            }else if(DateFormType.class.isInstance(property.getType())){
                LOGGER.info("请输入 [{}] ? 格式(yyyy-MM-dd)", property.getName());
                line = scanner.nextLine();
                variables.put(property.getId(), line);
            }else{
                LOGGER.info("类型暂不支持{} ",property.getType());
            }
            LOGGER.info("您输入的内容是:{}", line);
        }
        return variables;
    }
}

DemoMain.java文件、pom.xml文件、second_approve.bpmn20.xml文件,以及需要整个程序者可自取:

链接:https://pan.baidu.com/s/1COuj1T4uvFumOTfn1wo53g 
提取码:93xp


以下为打包项目到linux环境中运行

17.打包过程添加依赖(以下代码已经添加到上述的pom.xml文件中)

1)添加parent内容

    
        org.springframework.boot
        spring-boot-starter-parent
        2.0.0.RELEASE
        
    

 2)添加plugin内容,基于plugin可以启动我们的程序。加在dependences后面

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

3)添加启动程序的依赖 

        
            org.springframework.boot
            spring-boot-starter
        

18.将项目上传到虚拟机,编译运行,再打包

进入目录,以spring-boot方式启动程序

mvn spring-boot:run

 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第26张图片 

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第27张图片

打包目录mvn package

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第28张图片

 进入到target目录查看到两个jar文件

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第29张图片

注:第一个jar包含了所有的第三方依赖包括activiti和spring-boot依赖包

启动运行打包好的jar包:

java -jar activiti6-helloworld-1.0-SNAPSHOT.jar

【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld_第30张图片

该jar包可以放到任何有java环境上的机器上运行。

 完毕!

你可能感兴趣的:(Activiti)