架构学习资料
由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
}
}
④yml配置
spring:
datasource:
name: mydb
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://127.0.0.1:3306/db_activiti
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
⑤特别操作
在src/main/java目录下创建processes目录,否则将抛出异常:java.io.FileNotFoundException: class path resource [processes/] cannot be resolved to URL because it does not exist。processes目录的作用是存放bpmn流程定义文件,并对bpmn文件进行自动部署。如果创建到src/main/resources目录下则要求processes目录下至少存在一个文件(任意)。
==================================================================
2.流程部署
①Java代码
注意:如果放在processes目录下会被自动部署,下面的Java代码是手动部署。
@RunWith(SpringRunner.class)
@SpringBootTest
public class ProcessTest {
@Autowired
private RepositoryService repositoryService;
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
}
②数据库表分析
二进制数据表,存储了流程定义图形的XML文件和图片信息
保存流程定义的xml信息
保存流程定义的图片
部署信息表,存储了部署的相关信息(部署时间)
流程定义数据表,存储了当前流程图形的相关信息(id,name,版本号)
③解决乱码问题
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.activiti.spring.boot.ProcessEngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
@Override
public void configure(SpringProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setActivityFontName(“宋体”);
processEngineConfiguration.setLabelFontName(“宋体”);
}
}
3.流程查询
①第一步:创建ProcessDefinitionQuery对象
@Test
public void test02ProcessDefinitionQuery() {
//1.创建流程定义查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
//2.调用对应的方法执行查询
List list = query.list();
//3.遍历集合
for (ProcessDefinition processDefinition : list) {
String key = processDefinition.getKey();
String name = processDefinition.getName();
int version = processDefinition.getVersion();
System.err.println(“key=”+key);
System.err.println(“name=”+name);
System.err.println(“version=”+version);
}
}
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
@Test
public void test03TaskQuery() {
//创建任务查询对象
TaskQuery query = taskService.createTaskQuery();
//根据流程定义key和委托人查询待办任务
List list = query.processDefinitionKey(“MyProcess”).taskAssignee(“zuzu”).list();
for (Task task : list) {
String assignee = task.getAssignee();
String taskId = task.getId();
String taskName = task.getName();
//taskService需要使用@Autowired注解装配
taskService.complete(task.getId());//完成任务,使任务进入下一步
System.err.println(“assignee=”+assignee);
System.err.println(“taskId=”+taskId);
System.err.println(“taskName=”+taskName);
}
}
8.查询流程实例历史
//1.创建流程实例的历史查询对象,historyService使用@Autowired注解注入
HistoricProcessInstanceQuery query = historyService.createHistoricProcessInstanceQuery();
HistoricProcessInstance instance =
query.processInstanceId(“7501”) //流程实例的id
.finished()//调用这个方法后未完成的流程实例会返回null
.singleResult();
System.out.println(instance);
9.将任务指派给一个组
注意1:创建的新的流程定义要指定一个新的id。
注意2:创建了新的流程定义需要再次执行部署,再次启动流程。
10.领取任务
@Test
public void test04Claim() {
//1.创建任务查询对象
TaskQuery taskQuery = taskService.createTaskQuery();
//2.根据任务委托组查询任务列表
List list = taskQuery.taskCandidateGroup(“jingli”).list();
//3.遍历
for (Task task : list) {
String taskId = task.getId();
String userId = “jingli”;
//3.指派任务
taskService.claim(taskId, userId);
}
}
提示:可以根据任务委托人在领取任务前和领取任务后分别查询任务,之前没有之后有即为正确。
TaskQuery query = taskService.createTaskQuery();//创建任务查询对象
List list = query.processDefinitionKey(“MyProcess”) //指定流程定义
.taskAssignee(“jingli”)//指定委托人
.list();//执行查询
for (Task task : list) {
System.out.println(task);
}
11.流程变量
①在创建流程定义时指定流程变量
例如:用变量的方式指定委托人
创建MyProcess02.bpmn
创建后正常部署
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess02.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
②启动
@Test
public void test05StartProcessInstance() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//4.打印processInstance对象
System.err.println(processInstance);
}
带有变量的流程启动时,如果第一个任务中就存在变量,那么启动的时候就必须给出变量值。否则将抛出异常:org.activiti.engine.impl.javax.el.PropertyNotFoundException: Cannot resolve identifier ‘erzi’
@Test
public void test06StartProcessInstanceWithVariable() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess02”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//※为第一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“erzi”, “zhangsan”);
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId, variables);
//4.打印processInstance对象
System.err.println(processInstance);
}
③完成任务
如果完成当前任务时,下一个任务中包含变量,那么此时也必须给出下一个任务的变量值
@Test
public void test7CompleteTaskWithVariables() {
List list =
taskService.createTaskQuery() //创建任务查询对象
.processDefinitionKey(“MyProcess02”)//指定流程定义
.taskAssignee(“zhangsan”)//指定委托人
.list();//执行查询
for (Task task : list) {
String taskId = task.getId();
//在完成当前任务时,为下一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“sunzi”, “lisi”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
12.排他网关
①创建流程定义
部署、启动
@Test
public void test01ProcessDefinitionDeployment() {
//部署:将流程定义文件中流程定义信息存入数据库
repositoryService
.createDeployment() //创建部署构建器对象
.addClasspathResource(“MyProcess03.bpmn”) //添加要部署的流程定义文件名
.deploy(); //执行部署
}
@Test
public void test05StartProcessInstance() {
//1.查询流程定义对象
ProcessDefinition processDefinition =
repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“MyProcess03”)
.latestVersion()
.singleResult();
//2.获取流程定义的id
String processDefinitionId = processDefinition.getId();
//3.使用RunTimeService根据流程定义id启动流程定义
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinitionId);
//4.打印processInstance对象
System.err.println(processInstance);
}
②完成第一个任务时为排他网关指定变量值
@Test
public void test7CompleteTaskWithVariables() {
List list =
taskService.createTaskQuery() //创建任务查询对象
.processDefinitionKey(“MyProcess03”)//指定流程定义
.taskAssignee(“zhangsan”)//指定委托人
.list();//执行查询
for (Task task : list) {
String taskId = task.getId();
//在完成当前任务时,为下一个任务指定流程变量
Map<String,Object> variables = new HashMap<String, Object>();
variables.put(“day”, “5”);
//完成当前任务时为下一个任务指定变量值
taskService.complete(taskId, variables);//完成任务,使任务进入下一步
//Unknown property used in expression: ${sunzi}
//taskService.complete(taskId);
}
}
[3]创建流程监听器类
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
public class YesListener implements ExecutionListener {
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution execution) throws Exception {
System.err.println(“YesListener触发了!!!”);
}
}
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.ExecutionListener;
public class NoListener implements ExecutionListener {
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution execution) throws Exception {
System.err.println(“NoListener触发了!!!”);
}
}
[4]绑定监听器
④操作
- 部署
/**
- 部署
*/
最后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
utionListener {
private static final long serialVersionUID = 1L;
@Override
public void notify(DelegateExecution execution) throws Exception {
System.err.println(“NoListener触发了!!!”);
}
}
[4]绑定监听器
④操作
- 部署
/**
- 部署
*/
最后
码字不易,觉得有帮助的可以帮忙点个赞,让更多有需要的人看到
又是一年求职季,在这里,我为各位准备了一套Java程序员精选高频面试笔试真题,来帮助大家攻下BAT的offer,题目范围从初级的Java基础到高级的分布式架构等等一系列的面试题和答案,用于给大家作为参考
以下是部分内容截图
[外链图片转存中…(img-pu1eMkpv-1715805394601)]