前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >spring boot2与activiti7完美结合(踩坑)

spring boot2与activiti7完美结合(踩坑)

作者头像
kinbug [进阶者]
发布2020-02-17 15:47:30
16.8K1
发布2020-02-17 15:47:30
举报
文章被收录于专栏:IT进修之路IT进修之路

前言

        Activiti项目是一项新的基于Apache许可的开源BPM平台,从基础开始构建,旨在提供支持新的BPMN 2.0标准,包括支持对象管理组(OMG),面对新技术的机遇,诸如互操作性和云架构,提供技术实现。

        架构师Tom Baeyens说:“ Activiti有非常大的影响力来改变目前BPM的生态。Activiti的Apache授权,完整的功能,将使Activiti到达一个新的水平。Activiti将推动业界的创新,因为BPM技术可以广泛而自由地被应用。通过实现这些想法以及开源社区的努力,也让Activiti成为事实上的 BPM和BPMN标准执行“。

        SpringSource的首席技术官Adrian Coyler说道:”这是一个对Spring开发人员和Java社区总体的发展非常令人兴奋的事情,长期以来一直需要一个Apache许可的流程引擎,这对许多应用系统非常实用的需求。我们认为,Activiti作为新的应用领域扩展到的Java和开源的发展,特别是在云架构上”。

        扯的有点远了,Activiti7主要是分两大块          一、Activiti Cloud是一组从头开始设计的Cloud Native组件,可在分布式环境中使用。我们选择了Kubernetes作为我们的主要部署基础架构,并且我们将Spring Cloud / Spring Boot与Docker一起用于这些组件的容器化。但是GitHub上关注的人都很少,本次就忽略了。         二、Activiti Core就是对以前的版本进行了一些归纳和整理。也是今儿的主题。

整合

一、环境与搭建springboot项目

Java8,Springboot2,Activiti7,druid1.1.16,mysql8

地址:http://start.spring.io/  其它方式都行,具体...略...

二、坐标定位(pom)

代码语言:javascript
复制
<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.1</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<!-- 阿里 druid 数据源 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.16</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
		<dependency>
			<groupId>org.activiti.dependencies</groupId>
			<artifactId>activiti-dependencies</artifactId>
			<version>7.1.0.M5</version>
			<type>pom</type>
		</dependency>
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-spring-boot-starter</artifactId>
			<version>7.1.0.M5</version>
		</dependency>
		<!-- Activiti生成流程图 -->
		<dependency>
			<groupId>org.activiti</groupId>
			<artifactId>activiti-image-generator</artifactId>
			<version>7.1.0.M5</version>
		</dependency>

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-configuration-processor</artifactId>
			<optional>true</optional>
		</dependency>
		
		<!-- 工具jar Start -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.57</version>
		</dependency>
		<dependency>
			<groupId>org.apache.commons</groupId>
			<artifactId>commons-lang3</artifactId>
		</dependency>
		<!-- 工具jar end -->
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.junit.vintage</groupId>
					<artifactId>junit-vintage-engine</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
	</dependencies>

三、整合SpringSecurity

因为acitviti是整合了springSecurity的,根据官方dome找到2个工具类:

一: https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples/DemoApplicationConfiguration.java

二: https://github.com/Activiti/activiti-examples/blob/master/activiti-api-basic-task-example/src/main/java/org/activiti/examples/SecurityUtil.java

把这个2个类注入到spring容器中。

四、绘制自己的BPMN文件

我的是:

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess_1" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="one" activiti:candidateGroups="activitiTeam"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="two" activiti:candidateGroups="activitiTeam"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess_1">
    <bpmndi:BPMNPlane bpmnElement="myProcess_1" id="BPMNPlane_myProcess_1">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="50.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="130.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="280.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="430.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="85.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="130.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="235.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="280.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="385.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="430.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

图:

很简单的一个流程。

五、测试

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootActivitiApplicationTests {

	@Autowired
	private ProcessRuntime processRuntime;

	@Autowired
	private TaskRuntime taskRuntime;

	@Autowired
	private SecurityUtil securityUtil;

	@Autowired
	private RepositoryService repositoryService;


	@Test // 查看流程
	public void contextLoads() {
		securityUtil.logInAs("salaboy");
		Page processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));
		System.err.println("已部署的流程个数:" + processDefinitionPage.getTotalItems());
		for (Object obj : processDefinitionPage.getContent()) {
			System.err.println("流程定义:" + obj);
		}
	}
}

如果你的版本和我是一样的话,多半就会报错,sql少字段。这个应该是一个官方的BUG,只需要在 act_re_deployment中加两个字段就好了: VERSION_和 PROJECT_RELEASE_VERSION_    然后重新运行,应该就对了。但是打印的已部署个数却是0。说好的 processes 下自动部署呢,最后自己部署一下,发现一切都对了的。下面我给一些我测试的部署,查询,启动、执行的例子。

代码语言:javascript
复制
@RunWith(SpringRunner.class)
@SpringBootTest
public class BootActivitiApplicationTests {

	@Autowired
	private ProcessRuntime processRuntime;

	@Autowired
	private TaskRuntime taskRuntime;

	@Autowired
	private SecurityUtil securityUtil;

	@Autowired
	private RepositoryService repositoryService;

	@Test // 部署流程
	public void deploy() {
		securityUtil.logInAs("salaboy");
		String bpmnName = "MyProcess";
		DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name("请假流程");
		Deployment deployment = null;
		try {
			deployment = deploymentBuilder.addClasspathResource("processes/" + bpmnName + ".bpmn")
					.addClasspathResource("processes/" + bpmnName + ".png").deploy();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	@Test // 远程外部BPMN
	public void deploy2() {
		securityUtil.logInAs("salaboy");
		try {
			Deployment deployment = null;
			InputStream in = new FileInputStream(new File("C:\\Users\\飞牛\\git\\SpringBoot2_Activiti7\\src\\main\\resources\\processes\\leaveProcess.zip"));
			ZipInputStream zipInputStream = new ZipInputStream(in);
			deployment = repositoryService.createDeployment().name("请假流程2")
					// 指定zip格式的文件完成部署
					.addZipInputStream(zipInputStream).deploy();// 完成部署
			zipInputStream.close();
		} catch (Exception e) {
			// TODO 上线时删除
			e.printStackTrace();
		}
	}

	@Test // 查看流程
	public void contextLoads() {
		securityUtil.logInAs("salaboy");
		Page processDefinitionPage = processRuntime.processDefinitions(Pageable.of(0, 10));
		System.err.println("已部署的流程个数:" + processDefinitionPage.getTotalItems());
		for (Object obj : processDefinitionPage.getContent()) {
			System.err.println("流程定义:" + obj);
		}
	}

	@Test // 启动流程
	public void startInstance() {
		securityUtil.logInAs("salaboy");
		ProcessInstance processInstance = processRuntime
				.start(ProcessPayloadBuilder.start().withProcessDefinitionKey("myProcess_1").build());
		System.err.println("流程实例ID:" + processInstance.getId());
	}

	@Test // 执行流程
	public void testTask() {
		securityUtil.logInAs("salaboy");
		Page<Task> page = taskRuntime.tasks(Pageable.of(0, 10));
		if (page.getTotalItems() > 0) {
			for (Task task : page.getContent()) {
				System.err.println("当前任务有1:" + task);
				// 拾取
				taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
				// 执行
				taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId()).build());
			}
		} else {
			System.err.println("没的任务1");
		}

		page = taskRuntime.tasks(Pageable.of(0, 10));
		if (page.getTotalItems() > 0) {
			for (Task task : page.getContent()) {
				System.err.println("当前任务有2:" + task);
			}
		} else {
			System.err.println("没的任务2");
		}
	}
}

项目地址: https://gitee.com/flying-cattle/boot-activiti

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 整合
    • 一、环境与搭建springboot项目
      • 二、坐标定位(pom)
        • 三、整合SpringSecurity
          • 四、绘制自己的BPMN文件
            • 五、测试
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档