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

本文主要是介绍【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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

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

一、工具

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

IDEA创建流程项目。

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

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

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)

 

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

画流程图如下所示:

 

 

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

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

填写审批信息元素:

 

主管与人事审批信息:

 

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

6.填写表单信息

三个表单的信息:

 

 

7.填写每一个逻辑

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

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

 

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

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

8.IDEA中创建Maven工程

new project

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

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

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

 完整的依赖如下:

<dependencies><!--activiti引擎--><dependency><groupId>org.activiti</groupId><artifactId>activiti-engine</artifactId><version>6.0.0</version></dependency><!--单元测试依赖--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--日志组件依赖--><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.11</version></dependency><!--添加常用的组件guava--><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version></dependency><!--使用内测数据库依赖h2--><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><version>1.3.176</version></dependency></dependencies>

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

创建main方法 

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为只显示我们想要的信息,拷贝进去后重新运行即可。

<?xml version="1.0" encoding="utf-8" ?>
<configuration debug="false" scan="true" scanPeriod="30 seconds"><property name="log.dir" value="target/logs"/><property name="encoding" value="UTF-8"/><property name="plain" value="%msg%n"/><property name="std" value="%d{HH:mm:ss.SSS}[%thread][%-5level]%msg %X{user} %logger{10}.%M:%L%n "/><property name="normal" value="%d{yyyy-MM-dd:HH:mm:ss.SSS}[%thread][%-5level] %logger{10}.%M:%L %msg%n"/><!--控制台输出--><appender name="stdout" class="ch.qos.logback.core.ConsoleAppender"><encoder><pattern>${plain}</pattern><charset>${encoding}</charset></encoder></appender><!--时间滚动输出 Level为All 日志--><appender name="file"class="ch.qos.logback.core.rolling.RollingFileAppender"><File>${log.dir}/file.log</File><rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"><FileNamePattern>${log.dir}/file.%d{yyyy-MM-dd}.log</FileNamePattern><MaxHistory>30</MaxHistory></rollingPolicy><encoder><pattern>${std}</pattern><charset>${encoding}</charset></encoder></appender><logger name="root"><level value="ERROR"/></logger><logger name="com.syc"><level value="DEBUG"/></logger><root><appender-ref ref="stdout"/><appender-ref ref="file"/></root>
</configuration>

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<Task> 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<Task> list = taskService.createTaskQuery().list();LOGGER.info("待处理任务数量 [{}]", list.size());for (Task task : list) {LOGGER.info("待处理任务 [{}]", task.getName());Map<String, Object> 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<String, Object> getMap(ProcessEngine processEngine, Scanner scanner, Task task){Map<String, Object> variables = new HashMap<>();FormService formService = processEngine.getFormService();TaskFormData taskFormData = formService.getTaskFormData(task.getId());List<FormProperty> 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内容

    <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.0.RELEASE</version><relativePath/></parent>

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

    <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3)添加启动程序的依赖 

        <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>

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

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

mvn spring-boot:run

 

 

打包目录mvn package

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

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

启动运行打包好的jar包:

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

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

 完毕!

这篇关于【Activiti系列学习】--6.IDEA创建第一个流程引擎Activiti6.0程序Helloworld的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414370

相关文章

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

好题——hdu2522(小数问题:求1/n的第一个循环节)

好喜欢这题,第一次做小数问题,一开始真心没思路,然后参考了网上的一些资料。 知识点***********************************无限不循环小数即无理数,不能写作两整数之比*****************************(一开始没想到,小学没学好) 此题1/n肯定是一个有限循环小数,了解这些后就能做此题了。 按照除法的机制,用一个函数表示出来就可以了,代码如下

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”