- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Activiti7整合Springboot使用记录由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
通过https://start.spring.io/生成纯净的一个springboot工程 。
1
2
3
4
5
|
<dependency>
<groupid>org.activiti</groupid>
<artifactid>activiti-spring-boot-starter</artifactid>
<version>
7.1
.
0
.m6</version>
</dependency>
|
##activiti7中使用spring security,因此启动工程前,需要加入2个文件支持,2个文件的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
package
cn.gzsendi.activitidemotest.config;
import
java.util.arrays;
import
java.util.list;
import
java.util.stream.collectors;
import
org.slf4j.logger;
import
org.slf4j.loggerfactory;
import
org.springframework.context.annotation.bean;
import
org.springframework.context.annotation.configuration;
import
org.springframework.security.core.authority.simplegrantedauthority;
import
org.springframework.security.core.userdetails.user;
import
org.springframework.security.core.userdetails.userdetailsservice;
import
org.springframework.security.crypto.bcrypt.bcryptpasswordencoder;
import
org.springframework.security.crypto.password.passwordencoder;
import
org.springframework.security.provisioning.inmemoryuserdetailsmanager;
@configuration
public
class
activiticonfiguration {
private
logger logger = loggerfactory.getlogger(activiticonfiguration.
class
);
@bean
(name =
"userdetailsservice"
)
public
userdetailsservice myuserdetailsservice() {
inmemoryuserdetailsmanager inmemoryuserdetailsmanager =
new
inmemoryuserdetailsmanager();
//用户
string[][] usersgroupsandroles = {
{
"hefy"
,
"123456"
,
"role_activiti_user"
},
{
"liujh"
,
"123456"
,
"role_activiti_admin"
},
{
"liuky"
,
"123456"
,
"role_activiti_user"
},
{
"admin"
,
"123456"
,
"role_activiti_admin"
},
};
for
(string[] user : usersgroupsandroles) {
list<string> authoritiesstrings = arrays.aslist(arrays.copyofrange(user,
2
, user.length));
logger.info(
"> registering new user: "
+ user[
0
] +
" with the following authorities["
+ authoritiesstrings +
"]"
);
inmemoryuserdetailsmanager.createuser(
new
user(user[
0
], passwordencoder().encode(user[
1
]),
authoritiesstrings.stream().map(s ->
new
simplegrantedauthority(s)).collect(collectors.tolist())));
}
return
inmemoryuserdetailsmanager;
}
@bean
public
passwordencoder passwordencoder() {
return
new
bcryptpasswordencoder();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
package
cn.gzsendi.activitidemotest.utils;
import
java.util.collection;
import
org.springframework.beans.factory.annotation.autowired;
import
org.springframework.beans.factory.annotation.qualifier;
import
org.springframework.security.core.authentication;
import
org.springframework.security.core.grantedauthority;
import
org.springframework.security.core.context.securitycontextholder;
import
org.springframework.security.core.context.securitycontextimpl;
import
org.springframework.security.core.userdetails.userdetails;
import
org.springframework.security.core.userdetails.userdetailsservice;
import
org.springframework.stereotype.component;
import
javax.annotation.resource;
@component
public
class
securityutil {
@autowired
@qualifier
(
"userdetailsservice"
)
private
userdetailsservice userdetailsservice;
public
void
loginas(string username) {
userdetails user = userdetailsservice.loaduserbyusername(username);
if
(user ==
null
) {
throw
new
illegalstateexception(
"user "
+ username +
" doesn't exist, please provide a valid user"
);
}
securitycontextholder.setcontext(
new
securitycontextimpl(
new
authentication() {
@override
public
collection<?
extends
grantedauthority> getauthorities() {
return
user.getauthorities();
}
@override
public
object getcredentials() {
return
user.getpassword();
}
@override
public
object getdetails() {
return
user;
}
@override
public
object getprincipal() {
return
user;
}
@override
public
boolean
isauthenticated() {
return
true
;
}
@override
public
void
setauthenticated(
boolean
isauthenticated)
throws
illegalargumentexception {
}
@override
public
string getname() {
return
user.getusername();
}
}));
org.activiti.engine.impl.identity.authentication.setauthenticateduserid(username);
}
}
|
##加入activiti7的配置 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
server.port=
8080
server.servlet.context-path=/activitidemotest
spring.datasource.driver-
class
-name=com.mysql.cj.jdbc.driver
spring.datasource.url=jdbc:mysql:
//localhost:3306/activitidemo?usessl=false&useunicode=true&characterencoding=utf8&servertimezone=gmt%2b8&allowmultiqueries=true
spring.datasource.username=root
spring.datasource.password=
123456
spring.activiti.database-schema-update=
true
spring.activiti.db-history-used=
true
spring.activiti.history-level=full
spring.activiti.check-process-definitions=
false
spring.activiti.deployment-mode=never-fail
spring.activiti.process-definition-location-prefix=classpath:/process/
|
##启动springboot工程,让系统启动时帮我们建好25张表 2.安装activiti插件(设计器) ##idea 。
file->settings->plugins,然后找actibpm进行安装.
##流程图中乱码问题先提前设置防止:
修改idea64.exe.vmoptions文件,在文件中加上如下,然后重启idea 。
-dfile.encoding=utf-8 。
##进行流程设计 。
file->new->bpmnfile 。
设计好后,修改process1.bpmn成process1.xml,然后右键export file导出成process1.jpg,再将process1.bpmn修改成process1.bpmn20.xml,最后将2个文件放在process文件夹 。
使用activiti提供的api把流程定义内容存储起来,activiti执行把流程定义内容存储在数据库中.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
package
cn.gzsendi.activitidemotest;
/**
* created by jxlhl on 2021/8/18.
*/
import
org.activiti.engine.repositoryservice;
import
org.activiti.engine.repository.deployment;
import
org.activiti.engine.repository.deploymentbuilder;
import
org.junit.test;
import
org.junit.runner.runwith;
import
org.springframework.beans.factory.annotation.autowired;
import
org.springframework.boot.test.context.springboottest;
import
org.springframework.test.context.junit4.springrunner;
@runwith
(springrunner.
class
)
@springboottest
public
class
springbootjunittest {
//得到repositoryservice实例
@autowired
private
repositoryservice repositoryservice;
//0.流程部署,单个文件部署方式
@test
public
void
testdeployment(){
//使用repositoryservice进行部署
deploymentbuilder builder = repositoryservice.createdeployment();
builder.addclasspathresource(
"process/process1.bpmn20.xml"
);
builder.addclasspathresource(
"process/process1.jpg"
);
builder.name(
"first_activiti_process"
);
deployment deployment = builder.deploy();
//输出部署信息
system.out.println(
"流程部署id:"
+ deployment.getid());
system.out.println(
"流程部署名称:"
+ deployment.getname());
//流程部署id:125098e1-ffd9-11eb-8847-02004c4f4f50
//流程部署名称:first_activiti_process
}
}
|
执行此操作后activiti会将上边代码中指定的bpmn20文件和图片文件保存在activiti数据库.
流程定义部署后操作activiti的3张表 。
启动一个流程实例表示开始一次业务流程的运行 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
//1.流程实例启动
@test
public
void
teststartprocess(){
//根据流程定义id启动流程
processinstance processinstance = runtimeservice.startprocessinstancebykey(
"myprocess_1"
);
//输出实例信息
system.out.println(
"流程定义id:"
+ processinstance.getprocessdefinitionid());
system.out.println(
"流程实例id:"
+ processinstance.getid());
system.out.println(
"当前活动id:"
+ processinstance.getactivityid());
//流程定义id:myprocess_1:1:12702ed4-ffd9-11eb-8847-02004c4f4f50
//流程实例id:a9b162aa-ffda-11eb-bad1-02004c4f4f50
//当前活动id:null
}
|
流程实例启动,将操作以下几个数据库表 。
1
2
3
4
5
6
7
|
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
|
流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//2.任务查询
//流程启动后,任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
@test
public
void
testfindpersonaltasklist() {
//任务负责人
string assignee =
"liuky"
;
//根据流程key 和 任务负责人 查询任务
list<task> list = taskservice.createtaskquery()
.processdefinitionkey(
"myprocess_1"
)
.taskassignee(assignee)
.list();
for
(task task : list) {
system.out.println(
"流程实例id:"
+ task.getprocessinstanceid());
system.out.println(
"任务id:"
+ task.getid());
system.out.println(
"任务负责人:"
+ task.getassignee());
system.out.println(
"任务名称:"
+ task.getname());
}
//流程实例id:a9b162aa-ffda-11eb-bad1-02004c4f4f50
//任务id:a9b5815e-ffda-11eb-bad1-02004c4f4f50
//任务负责人:liuky
//任务名称:提交申请
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@test
public
void
complettask(){
//根据流程key和任务的负责人查询任务并选择其中的一个任务处理,这里用的
//是singleresult返回一条,真实环境中是通过步骤5中查询出所有的任务,然后在页面上选择一个任务进行处理.
task task = taskservice.createtaskquery()
.processdefinitionkey(
"myprocess_1"
)
//流程key
.taskassignee(
"liuky"
)
//要查询的负责人
.singleresult();
//完成任务,参数:任务id
taskservice.complete(task.getid());
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//流程结束,或流程流转过程中的历史信息查询
@test
public
void
findhistoryinfo(){
//获取 actinst表的查询对象
historicactivityinstancequery instancequery = historyservice.createhistoricactivityinstancequery();
//查询 actinst表,条件:根据 instanceid 查询
instancequery.processinstanceid(
"fb5b7674-ffde-11eb-91f8-02004c4f4f50"
);
//增加排序操作,orderbyhistoricactivityinstancestarttime 根据开始时间排序 asc 升序
instancequery.orderbyhistoricactivityinstancestarttime().asc();
//查询所有内容
list<historicactivityinstance> activityinstancelist = instancequery.list();
//输出结果
for
(historicactivityinstance hi : activityinstancelist) {
system.out.println(
""
);
system.out.println(
"===================-==============="
);
system.out.println(hi.getstarttime());
system.out.println(hi.getassignee());
system.out.println(hi.getactivityid());
system.out.println(hi.getactivityname());
system.out.println(hi.getprocessdefinitionid());
system.out.println(hi.getprocessinstanceid());
system.out.println(
"===================-==============="
);
system.out.println(
""
);
}
}
|
查询流程相关信息,包含流程定义,流程部署,流程定义版本 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@test
public
void
queryprocessdefinition(){
//得到processdefinitionquery对象
processdefinitionquery processdefinitionquery = repositoryservice.createprocessdefinitionquery();
//查询出当前所有的流程定义
list<processdefinition> definitionlist = processdefinitionquery.processdefinitionkey(
"myprocess_1"
)
.orderbyprocessdefinitionversion()
.desc()
.list();
//打印结果
for
(processdefinition processdefinition : definitionlist) {
system.out.println(
"流程定义 id="
+processdefinition.getid());
system.out.println(
"流程定义 name="
+processdefinition.getname());
system.out.println(
"流程定义 key="
+processdefinition.getkey());
system.out.println(
"流程定义 version="
+processdefinition.getversion());
system.out.println(
"流程部署id ="
+processdefinition.getdeploymentid());
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//删除流程
@test
public
void
deletedeployment(){
string deploymentid =
"125098e1-ffd9-11eb-8847-02004c4f4f50"
;
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryservice.deletedeployment(deploymentid);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
//repositoryservice.deletedeployment(deploymentid, true);
}
|
github: https://github.com/jxlhljh/activitidemotest.git gitee: https://gitee.com/jxlhljh/activitidemotest.git 。
到此这篇关于activiti7整合springboot使用记录的文章就介绍到这了,更多相关springboot整合activiti7内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/jxlhljh/article/details/119775872 。
最后此篇关于Activiti7整合Springboot使用记录的文章就讲到这里了,如果你想了解更多关于Activiti7整合Springboot使用记录的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
SpringBoot-Admin 服务监控 简单介绍 Spring Boot Actuator 是 Spring Boot 自带的一个功能模块, 提供了一组已经开箱即用的生产环境下常用
我想查找通过关键字匹配字段 nameEnglish 或 nameChinese 的模型列表。我花了一个多小时谷歌搜索但我做不到。请帮忙。 Springboot Mongo 入门示例 https://s
(请注意:在调查 this issue 时,我更好地发现了我在此处介绍的问题根源) 我对 Hibernate 和 SpringBoot 非常陌生。我的项目涉及一个搜索引擎,其中索引(javafx 客户
我最近有一个 Web 应用程序从 springboot 升级到 springboot 2。当我将其部署到 Tomcat 8 时,它似乎启动了,但没有完全启动。 在 localhost.2019-09-
我是 Spring boot 的新手...我在运行 Controller 时遇到问题, Description: Field todoService in com.springboot.todoCon
我有一个SpringBoot应用程序,它使用以下配置与PostgreSQL通信,通过AWS Beanstrik部署:。在我将AWS Aurora证书更新为rds-ca-ecc384-g1之前,一切都很
实在是不知道标题写什么了 可以在评论区给个建议哈哈哈哈 先用这个作为标题吧 尝试使用 国内给出的 AI 大模型做出一个 可以和 AI 对话的 网站出来 使用 智普AI 只能 在控制
一、介绍 在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储
Selenium Selenium是一个用于Web应用程序自动化测试的开源工具套件。它主要用于以下目的: 浏览器自动化:Selenium能够模拟真实用户在不同浏览器(如Chrome、Fire
一、简介 在实际的项目开发过程中,经常需要用到邮件通知功能。例如,通过邮箱注册,邮箱找回密码,邮箱推送报表等等,实际的应用场景非常的多。 早期的时候,为了能实现邮件的自动发送功能,通常会使用 Ja
SpringBoot:基于redis自定义注解实现后端接口防重复提交校验 一、添加依赖 org.springframework.boot spring
SpringBoot:使用Jackson完成全局序列化配置 一、测试准备 com.fasterxml.jackson.core jackson-cor
springboot:整合rocketmq 一、简易消息操作 生产者整合mq 导入依赖 org.springframework.boot
springboot:常用注解 一、spring常用注解 包扫描+组件标注注解 @Component:泛指各种组件 @Controller、@Service、@Repository都可以称为@Comp
我们经常需要在两个系统之间进行一些数据的交互,这时候我们就需要开发数据交互接口。 一般来说,遇到比较多的接口有HTTP接口、WebService接口、FTP文件传输。今天我要来学习一下在SpringB
背景 近期项目上线,甲方要求通过安全检测才能进行验收,故针对扫描结果对系统进行了一系列的安全加固,本文对一些常见的安全问题及防护策略进行介绍,提供对应的解决方案 跨站脚本攻击 XSS常发生于论坛评论等
1.排除 Spring-boot-starter 默认的日志配置 将原本的 spring-boot-starter 改为 org.springframework.boot
springboot:解决跨域问题 一、跨域简介 URL的组成: // 协议 + 域名(子域名 + 主域名) + 端口号 + 资源地址 http://www.baidu.com:8080/ 只要协
一、自定义Starter 的思路: 创建一个Maven工程,创建三个模块 一个模块为demo-app,一个模块为demo-module,一个模块为demo-module-springboot-star
1.pom.xml 4.0.0 org.springframework.boot spring-boot-starter-parent
我是一名优秀的程序员,十分优秀!