最后
现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。
所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。
act_re_procdef :流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray :流程资源表,流程部署的 bpmn文件和png图片会保存在该表中
流程定义部署在Activiti后就可以通过工作流管理业务流程,也就是说上边部署的出差申请流程可以使用了。
针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于Java类和Java对象的关系,类定义好了后需要new创建一个对象使用,当然可以new出多个对象来,对于出差申请流程,张三可以发起一个出差申请单需要启动一个流程实例。
/**
- 启动一个流程实例
*/
@Test
public void test05(){
// 1.创建ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RuntimeService对象
RuntimeService runtimeService = engine.getRuntimeService();
// 3.根据流程定义的id启动流程
String id= “evection”;
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(id);
// 4.输出相关的流程实例信息
System.out.println(“流程定义的ID:” + processInstance.getProcessDefinitionId());
System.out.println(“流程实例的ID:” + processInstance.getId());
System.out.println(“当前活动的ID:” + processInstance.getActivityId());
}
输出内容:
启动流程实例涉及到的表结构
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户的历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
流程启动后,任务的负责人就可以查询自己当前能够处理的任务了,查询出来的任务都是当前用户的待办任务
/**
- 任务查询
*/
@Test
public void test06(){
String assignee =“zhansan”;
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 任务查询 需要获取一个 TaskService 对象
TaskService taskService = engine.getTaskService();
// 根据流程的key和任务负责人 查询任务
List list = taskService.createTaskQuery()
.processDefinitionKey(“evection”)
.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());
}
}
输出结果
任务负责人查询出来了待办的人,选择任务进行处理,完成任务
/**
- 流程任务的处理
*/
@Test
public void test07(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
TaskService taskService = engine.getTaskService();
Task task = taskService.createTaskQuery()
.processDefinitionKey(“evection”)
.taskAssignee(“zhansan”)
.singleResult();
// 完成任务
taskService.complete(task.getId());
}
zhangsan处理了这个操作后,流程就流转到了 lisi处
然后就是不同的用户登录,然后查询任务处理任务,直到任务流程走完。
查询流程相关的信息,包括流程的定义,流程的部署,流程定义的版本
/**
- 查询流程的定义
*/
@Test
public void test08(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = engine.getRepositoryService();
// 获取一个 ProcessDefinitionQuery对象 用来查询操作
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
List list = processDefinitionQuery.processDefinitionKey(“evection”)
.orderByProcessDefinitionVersion() // 安装版本排序
.desc() // 倒序
.list();
// 输出流程定义的信息
for (ProcessDefinition processDefinition : list) {
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());
}
}
输出结果
流程定义的ID:evection:1:12504
流程定义的name:出差申请单
流程定义的key:evection
流程定义的version:1
流程部署的id:12501
/**
- 删除流程
*/
@Test
public void test09(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = engine.getRepositoryService();
// 删除流程定义,如果该流程定义已经有了流程实例启动则删除时报错
repositoryService.deleteDeployment(“12501”);
// 设置为TRUE 级联删除流程定义,及时流程有实例启动,也可以删除,设置为false 非级联删除操作。
//repositoryService.deleteDeployment(“12501”,true);
}
注意:项目开发中级联删除操作的权限一般只开发给超级管理员使用。
现在我们的流程资源文件已经上传到了数据库中,如果其他用户想要查看这些资源,可以从数据库中把这些资源下载到本地。
解决方案:
-
jdbc对blob类型处理clob类型数据读取出来就可以了。
-
使用activiti的api来实现操作。
使用activiti的api来操作我们需要添加commons-io的依赖
commons-io
commons-io
2.6
实现代码
/**
- 读取数据库中的资源文件
*/
@Test
public void test10() throws Exception{
// 1.得到ProcessEngine对象
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 2.获取RepositoryService对象
RepositoryService repositoryService = engine.getRepositoryService();
// 3.得到查询器
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(“evection”)
.singleResult();
// 4.获取流程部署的id
String deploymentId = definition.getDeploymentId();
// 5.通过repositoryService对象的相关方法 来获取图片信息和bpmn信息
// png图片
InputStream pngInput = repositoryService
.getResourceAsStream(deploymentId, definition.getDiagramResourceName());
// bpmn 文件的流
InputStream bpmnInput = repositoryService
.getResourceAsStream(deploymentId, definition.getResourceName());
// 6.文件的保存
File filePng = new File(“d:/evection.png”);
File fileBpmn = new File(“d:/evection.bpmn”);
OutputStream pngOut = new FileOutputStream(filePng);
OutputStream bpmnOut = new FileOutputStream(fileBpmn);
IOUtils.copy(pngInput,pngOut);
IOUtils.copy(bpmnInput,bpmnOut);
pngInput.close();
总结:心得体会
既然选择这个行业,选择了做一个程序员,也就明白只有不断学习,积累实战经验才有资格往上走,拿高薪,为自己,为父母,为以后的家能有一定的经济保障。
学习时间都是自己挤出来的,短时间或许很难看到效果,一旦坚持下来了,必然会有所改变。不如好好想想自己为什么想进入这个行业,给自己内心一个答案。
面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。
最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
。
面试大厂,最重要的就是夯实的基础,不然面试官随便一问你就凉了;其次会问一些技术原理,还会看你对知识掌握的广度,最重要的还是你的思路,这是面试官比较看重的。
最后,上面这些大厂面试真题都是非常好的学习资料,通过这些面试真题能够看看自己对技术知识掌握的大概情况,从而能够给自己定一个学习方向。包括上面分享到的学习指南,你都可以从学习指南里理顺学习路线,避免低效学习。
大厂Java架构核心笔记(适合中高级程序员阅读):
[外链图片转存中…(img-RenkP6Cq-1715549650735)]