Springboot 整合Flowable工作流框架搭建

news/2024/3/29 18:19:44/文章来源:https://blog.csdn.net/GISuuser/article/details/129207125

我们在开发自动化办公软件时经常会遇到各种审批流程功能,这个使用就需要使用到工作流引擎。目前主流的工作流引擎有ActivitiFlowablecamunda,其中Flowable是在Activiti的基础上开发出来的,基于BPMN2.0协议,它包括 BPMN(Business Process Model and Notation)引擎、CMMN(Case Management Model and Notation)引擎、DMN(Decision Model and Notation)引擎、表单引擎(Form Engine)等模块。

这里我们基于springboot和PostgreSQL数据库,介绍一下如何搭建一个基础的Flowable工作流框架。

创建项目,添加依赖

  1. 下图是我在线创建的springboot项目,只添加了Spring Web和Postgre SQL Driver两个依赖。
    创建项目
  2. 添加Flowable依赖
<dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter</artifactId><version>6.7.2</version>
</dependency>
  1. 配置数据库链接

    这里要解释一下,网上有的博文说,添加完数据库,启动服务,就会在数据库里自动创建一堆表,本人测试需要创建bpmn20.xml文件后,数据库才会自动生成对应的表。

spring:datasource:username: postgrespassword: postgresurl: jdbc:postgresql://192.168.2.172/test

到这里已经完成了项目的基础配置。

bpmn20.xml文件制作

在整个工作流框架中,比较核心的是bpmn20.xml文件的制作,如果之前没有一定的基础,制作整个文件还是有点难度的。idea的插件市场里有一个Flowable BPMN visualizer插件,可以在idea中直接用来制作bpmn20.xml文件。
插件安装
安装插件后,在resources文件夹下创建processes文件夹,流程文件默认放在此文件夹下。idea中右键创建文件,选择BPMN 2.0 file
创建文件
注意文件名要以**.bpmn20.xml**结尾。在创建的文件上,右键选择View BPMN。
编辑流程文件
在弹出的编辑器中,即可进行相关的绘制操作。新手,注意,在编辑器上右键可以创建节点。
流程图
网上也有一些其他工具可以用来绘制的,都可以尝试。我的xml文件源码如下:

<?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:flowable="http://flowable.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.flowable.org/processdef"><process id="ask_for_leave" name="ask_for_leave" isExecutable="true"><startEvent id="sid-8f75290b-6d4f-4304-98e3-592be1f19a4e"/><endEvent id="sid-4d3f3115-90f9-4cad-a8d3-df415f8aaa9d"/><userTask id="sid-ca4fe38f-af1d-47ad-8646-d045a82fcb6a" name="请假"/><userTask id="sid-7b7c9585-5913-49fe-910f-fea79e53518c" name="组长审批" flowable:assignee="${taskUser}"/><userTask id="sid-627ef23c-3f54-4536-bda9-bbf0d3243230" name="经理审批" flowable:assignee="${taskUser}"/><exclusiveGateway id="sid-becd3cfd-2ede-4df6-8916-83d9e4b2eb5f" /><sequenceFlow id="sid-b1bdf216-3433-4052-ae80-ad753e16aed7" sourceRef="sid-becd3cfd-2ede-4df6-8916-83d9e4b2eb5f" targetRef="sid-627ef23c-3f54-4536-bda9-bbf0d3243230" name="通过"><conditionExpression xsi:type="tFormalExpression">${finishFlag==\"YES\"}</conditionExpression></sequenceFlow><sequenceFlow id="sid-0b327947-1e7f-48c3-8047-e8afc3d15005" sourceRef="sid-8f75290b-6d4f-4304-98e3-592be1f19a4e" targetRef="sid-ca4fe38f-af1d-47ad-8646-d045a82fcb6a"/><sequenceFlow id="sid-e5703760-35e2-497f-9501-7b616d5c1d02" sourceRef="sid-ca4fe38f-af1d-47ad-8646-d045a82fcb6a" targetRef="sid-7b7c9585-5913-49fe-910f-fea79e53518c"/><sequenceFlow id="sid-17b98be9-ef29-48a8-8cf6-cfde4be9d7c9" sourceRef="sid-7b7c9585-5913-49fe-910f-fea79e53518c" targetRef="sid-becd3cfd-2ede-4df6-8916-83d9e4b2eb5f"/><serviceTask id="sid-ddda9b4d-414e-40d0-aaa1-1a8bbac4d49a" flowable:exclusive="true" name="发送失败消息" flowable:class="com.work.flow.listener.TestServiceListener"/><sequenceFlow id="sid-7f8d7cc2-ddd0-4cb4-9ce6-81e8b42f4717" sourceRef="sid-becd3cfd-2ede-4df6-8916-83d9e4b2eb5f" targetRef="sid-ddda9b4d-414e-40d0-aaa1-1a8bbac4d49a" name="不通过"><conditionExpression xsi:type="tFormalExpression">${finishFlag==\"NO\"}</conditionExpression></sequenceFlow><sequenceFlow id="sid-95ed6745-c15f-4489-a9a5-93f4aeea1f43" sourceRef="sid-ddda9b4d-414e-40d0-aaa1-1a8bbac4d49a" targetRef="sid-4d3f3115-90f9-4cad-a8d3-df415f8aaa9d"/><exclusiveGateway id="sid-03e9886b-d80c-4a5a-8916-76f2b6683727" /><sequenceFlow id="sid-e8f7bf08-9b5b-4f0b-b0aa-c1a74d42e870" sourceRef="sid-03e9886b-d80c-4a5a-8916-76f2b6683727" targetRef="sid-ddda9b4d-414e-40d0-aaa1-1a8bbac4d49a" name="不通过"><conditionExpression xsi:type="tFormalExpression">${finishFlag==\"NO\"}</conditionExpression></sequenceFlow><sequenceFlow id="sid-fc8f3bf6-d817-4d6b-9dbd-f15d11032fae" sourceRef="sid-627ef23c-3f54-4536-bda9-bbf0d3243230" targetRef="sid-03e9886b-d80c-4a5a-8916-76f2b6683727"/><endEvent id="sid-f7bc1956-c2b1-4036-99fa-0318f6da4221"/><sequenceFlow id="sid-2a97e964-4e84-4936-9356-14b7b7b6ecb4" sourceRef="sid-03e9886b-d80c-4a5a-8916-76f2b6683727" targetRef="sid-f7bc1956-c2b1-4036-99fa-0318f6da4221" name="通过"><conditionExpression xsi:type="tFormalExpression">${finishFlag==\"YES\"}</conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_ask_for_leave"><bpmndi:BPMNPlane bpmnElement="ask_for_leave" id="BPMNPlane_ask_for_leave"><bpmndi:BPMNShape id="shape-44c54737-7c91-4844-8210-7db7f6853bb6" bpmnElement="sid-8f75290b-6d4f-4304-98e3-592be1f19a4e"><omgdc:Bounds x="-245.0" y="-65.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-12f82f19-3220-442d-893b-b139db4834e4" bpmnElement="sid-4d3f3115-90f9-4cad-a8d3-df415f8aaa9d"><omgdc:Bounds x="-155.0" y="15.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-146cee26-7a5b-4da7-9bbb-6c392e645b94" bpmnElement="sid-ca4fe38f-af1d-47ad-8646-d045a82fcb6a"><omgdc:Bounds x="-180.0" y="-75.0" width="55.0" height="50.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-bd5bc59b-ab57-4e3c-8dfa-cb2827d9a331" bpmnElement="sid-7b7c9585-5913-49fe-910f-fea79e53518c"><omgdc:Bounds x="-75.0" y="-80.0" width="80.0" height="60.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-cc2b2bce-04fd-4641-ae8b-419d9f79c2b0" bpmnElement="sid-627ef23c-3f54-4536-bda9-bbf0d3243230"><omgdc:Bounds x="185.0" y="-97.5" width="100.0" height="55.0"/></bpmndi:BPMNShape><bpmndi:BPMNShape id="shape-43f90d29-b7d6-4a74-8acb-1fc7f3f29289" bpmnElement="sid-becd3cfd-2ede-4df6-8916-83d9e4b2eb5f"><omgdc:Bounds x="55.0" y="-80.0" width="40.0" height="40.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-9eca388f-9baf-4a0b-8201-892c738b6ad0" bpmnElement="sid-b1bdf216-3433-4052-ae80-ad753e16aed7"><omgdi:waypoint x="95.0" y="-60.0"/><omgdi:waypoint x="185.0" y="-70.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-a5e04944-60fb-4696-ad16-c8092d6c0bb5" bpmnElement="sid-0b327947-1e7f-48c3-8047-e8afc3d15005"><omgdi:waypoint x="-215.0" y="-50.0"/><omgdi:waypoint x="-180.0" y="-50.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-6fb6a4c1-3b9a-4238-a66b-10f3d8571af1" bpmnElement="sid-e5703760-35e2-497f-9501-7b616d5c1d02"><omgdi:waypoint x="-125.0" y="-50.0"/><omgdi:waypoint x="-75.0" y="-50.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-e23fcf4e-1309-4639-a40e-9f0fe3fb42b7" bpmnElement="sid-17b98be9-ef29-48a8-8cf6-cfde4be9d7c9"><omgdi:waypoint x="5.0" y="-50.0"/><omgdi:waypoint x="55.0" y="-60.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-d6c43ede-95db-49fe-a468-0c8678deff6f" bpmnElement="sid-ddda9b4d-414e-40d0-aaa1-1a8bbac4d49a"><omgdc:Bounds x="-20.0" y="7.5" width="110.0" height="75.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-80b91b72-184a-4add-878d-a0553d8fdd04" bpmnElement="sid-7f8d7cc2-ddd0-4cb4-9ce6-81e8b42f4717"><omgdi:waypoint x="75.0" y="-40.0"/><omgdi:waypoint x="62.5" y="7.5"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-92accc38-c426-45f8-bf82-4ab1d8b6625b" bpmnElement="sid-95ed6745-c15f-4489-a9a5-93f4aeea1f43"><omgdi:waypoint x="-20.0" y="45.0"/><omgdi:waypoint x="-125.0" y="30.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-aed10d1f-11b7-4c70-91ca-63514182f93f" bpmnElement="sid-03e9886b-d80c-4a5a-8916-76f2b6683727"><omgdc:Bounds x="225.0" y="15.0" width="40.0" height="40.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-1a9651dc-930e-4642-b2f3-4ba0b47fe97d" bpmnElement="sid-e8f7bf08-9b5b-4f0b-b0aa-c1a74d42e870"><omgdi:waypoint x="225.0" y="35.0"/><omgdi:waypoint x="90.0" y="45.0"/></bpmndi:BPMNEdge><bpmndi:BPMNEdge id="edge-5e55bb58-f07a-45d5-bb8a-8c13a6c0b9dd" bpmnElement="sid-fc8f3bf6-d817-4d6b-9dbd-f15d11032fae"><omgdi:waypoint x="260.0" y="-42.5"/><omgdi:waypoint x="245.0" y="15.0"/></bpmndi:BPMNEdge><bpmndi:BPMNShape id="shape-12be209b-f581-4e87-b480-41c60acb8d8e" bpmnElement="sid-f7bc1956-c2b1-4036-99fa-0318f6da4221"><omgdc:Bounds x="255.0" y="100.0" width="30.0" height="30.0"/></bpmndi:BPMNShape><bpmndi:BPMNEdge id="edge-7aba8c58-63e5-4c57-b3d7-679ad58b6388" bpmnElement="sid-2a97e964-4e84-4936-9356-14b7b7b6ecb4"><omgdi:waypoint x="245.0" y="55.0"/><omgdi:waypoint x="270.0" y="100.0"/></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

接口开发

  1. 防止流程图乱码配置

    package com.work.flow.config;import org.flowable.spring.SpringProcessEngineConfiguration;
    import org.flowable.spring.boot.EngineConfigurationConfigurer;
    import org.springframework.context.annotation.Configuration;@Configuration
    public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {@Overridepublic void configure(SpringProcessEngineConfiguration engineConfiguration) {engineConfiguration.setActivityFontName("宋体");engineConfiguration.setLabelFontName("宋体");engineConfiguration.setAnnotationFontName("宋体");}
    }
  2. 发起流程接口

    package com.work.flow.controller;import org.flowable.bpmn.model.BpmnModel;
    import org.flowable.engine.*;
    import org.flowable.engine.runtime.Execution;
    import org.flowable.engine.runtime.ProcessInstance;
    import org.flowable.image.ProcessDiagramGenerator;
    import org.flowable.task.api.Task;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import org.springframework.web.bind.annotation.RestController;import javax.servlet.http.HttpServletResponse;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;@RestController
    public class TestController {@AutowiredRuntimeService runtimeService;@AutowiredTaskService taskService;@AutowiredRepositoryService repositoryService;@AutowiredProcessEngine processEngine;@GetMapping( "/add")public String addExpense(@RequestParam String userId) {//启动流程HashMap<String, Object> map = new HashMap<>(4);//name="客服代表" flowable:candidateGroups="${customerServiceId}"map.put("userId", userId);//<process id="adviceApply" name="投诉建议" isExecutable="true">ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("ask_for_leave", map);return "提交成功.流程Id为:" + processInstance.getId();}
    }

    发起申请

  3. 获取流程图接口

@GetMapping("/pic")public void showPic(HttpServletResponse resp, @RequestParam String processId) throws Exception {System.out.println("收到请求"+processId);List<ProcessInstance> instances  =runtimeService.createProcessInstanceQuery().list();for (ProcessInstance instance : instances) {System.out.println(instance.getId());}ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();if (pi == null) {return;}List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(processId).list();List<String> activityIds = new ArrayList<>();List<String> flows = new ArrayList<>();for (Execution exe : executions) {List<String> ids = runtimeService.getActiveActivityIds(exe.getId());activityIds.addAll(ids);}/*** 生成流程图*/BpmnModel bpmnModel = repositoryService.getBpmnModel(pi.getProcessDefinitionId());ProcessEngineConfiguration engconf = processEngine.getProcessEngineConfiguration();ProcessDiagramGenerator diagramGenerator = engconf.getProcessDiagramGenerator();InputStream in = diagramGenerator.generateDiagram(bpmnModel, "png", activityIds, flows, engconf.getActivityFontName(), engconf.getLabelFontName(), engconf.getAnnotationFontName(), engconf.getClassLoader(), 1.0, false);OutputStream out = null;byte[] buf = new byte[1024];int legth = 0;try {out = resp.getOutputStream();while ((legth = in.read(buf)) != -1) {out.write(buf, 0, legth);}out.flush();} catch (Exception e) {e.printStackTrace();} finally {if (in != null) {in.close();}if (out != null) {out.close();}System.out.println("运行结束");}}

测试流程图

  1. 流程推进接口
/*** 流转** @param processId 流程id*/@GetMapping("/apply")public String apply(@RequestParam String processId,@RequestParam String userId,@RequestParam boolean isPass) {//查询当前办理人的任务IDTask task = taskService.createTaskQuery()//使用流程实例ID.processInstanceId(processId)//任务办理人.singleResult();if (task == null) {throw new RuntimeException("流程不存在");}//通过审核HashMap<String, Object> map = new HashMap<>();map.put("taskUser", userId);String pass = "NO";if(isPass){pass = "YES";}map.put("finishFlag", pass);taskService.complete(task.getId(), map);return "processed ok!";}

推进流程
走流程后,再次查看流程图
新流程图

总结

  1. 总体bpmn20.xml的配置比较麻烦,需要一定的专业知识
  2. 上手还是有一定的难度的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_73879.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大型旋转设备滑动轴承X、Y测点振动值说明(转载的)

滑动轴承支撑的大型旋转设备&#xff0c;绝大部分的故障都表现为不平衡引起的1倍频振动&#xff0c;诊断故障原因要根据振动随转速、负荷、温度、时间的变化情况来具体判断。滑动轴承设备的诊断主要依据电涡流传感器测量轴和轴瓦间的相对振动&#xff0c;判断转子相关的各种问题…

Linux 脚本(sh)之 定时清理悬空、指定镜像,自动增长版本号

定时任务(images_clean)&#xff1a; 位置&#xff1a;/mydata/hostmachine_jenkins/images_clean.sh 作用&#xff1a;Jenkins发布之后&#xff0c;遗留下来的老版镜像以及悬空镜像进行定时清理 注意&#xff1a;如果你需要发布新的服务&#xff0c;那么你需要进入当前目录…

快到金3银4了,准备跳槽的可以看看

前两天跟朋友感慨&#xff0c;今年的铜九铁十、裁员、疫情导致好多人都没拿到offer!现在已经12月了&#xff0c;具体明年的金三银四只剩下两个月。 对于想跳槽的职场人来说&#xff0c;绝对要从现在开始做准备了。这时候&#xff0c;很多高薪技术岗、管理岗的缺口和市场需求也…

高品质运动耳机哪款更好用、运动耳机最好的牌子推荐

在运动的时候大家都会选择戴上耳机&#xff0c;用音乐来”调味“&#xff0c;让跑步的过程不那么枯燥乏味。说到运动耳机&#xff0c;除了老生常谈的音质以外&#xff0c;耳机的材质、耳机的工艺&#xff0c;耳机的佩戴稳固性等&#xff0c;也都在影响着用户的体验&#xff0c;…

未来土地利用模拟FLUS模型

未来土地利用模拟&#xff08;FutureLand-Use Simulation, FLUS&#xff09;模型1 模型简介1.1 基于ANN 的适宜性概率计算1.2 基于自适应惯性机制的元胞自动机1.3 模拟精度评价参考流域 径流变化是 自然因素和 人为因素共同作用的结果&#xff0c;其中人为因素最为直接的方式就…

流感来了,这类人最容易感染!

最近有学校因多名学生发热停课&#xff0c;浙江多地疾控也提醒大家现在是进入了甲流高发期。今天就来讲一讲甲流该如何防护。首先甲流与普通感冒不同&#xff0c;感冒病原体是鼻病毒、冠状病毒、副流感病毒等。流感病毒是正粘病毒科&#xff0c;根据核蛋白和基质蛋白M1抗原性的…

Fabric.js使用说明Part 2

目录一、Fabric.js使用说明Part 1Fabric.js简介 开始方法事件canvas常用属性对象属性图层层级操作复制和粘贴二、Fabric.js使用说明Part 2锁定拖拽和缩放画布分组动画图像滤镜渐变右键菜单删除三、Fabric.js使用说明Part 3自由绘画绘制背景图片绘制文本绘制线和路径一、锁定Fab…

FSM——squirrel状态机使用

FSM——squirrel状态机使用 1 FSM介绍 1.1 概念 FSM&#xff08;finite state machine&#xff09;:有限状态机 是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。核心内容&#xff1a;有限个状态、通过外部操作引起状态的转移。用来对状态的流转进行解耦&a…

高等工程数学张韵华版第二章课后题

答案仅供参考 本章内容 第 2 章 线性空间 2.1 向量的相关性 2.1.1 线性组合和线性表示 2.1.2 线性相关与线性无关 2.2 秩 2.2.1 向量组的秩 2.2.2 矩阵的秩 2.2.3 相抵标准形 2.3 线性空间 2.3.1 线性空间的定义 2.3.2 线性子空间 2.4 维、基、坐标 2.4.1 维、基、坐标的定义…

复杂场景的接口测试

测试场景一&#xff1a;被测业务操作是由多个API调用协作完成 背景&#xff1a;一个单一的前端操作可能会触发后端一系列的API调用&#xff0c;此时API的测试用例就不再是简单的单个API调用&#xff0c;而是一系列API的调用 存在的情况&#xff1a;存在后一个API需要使用前一个…

springboot+vue软件bug项目测试过程管理系统

config&#xff1a;主要用来存储配置文件&#xff0c;以及其他不怎么动用的信息 controller&#xff1a;项目的主要控制文件 dao: 主要用来操作数据库 entity: 实体&#xff0c;用来放与数据库表里对应的实体类&#xff0c;表中的字段对应类中的属性值&#xff0c;并…

视觉SLAM数据集(一):TUM DataSet

首先给出数据集下载地址&#xff1a;TUM Dataset Download。 如果你是第一次做实验&#xff0c;建议下载xyz的数据集&#xff0c;因为它的动作相对很小&#xff0c;只包含桌面上的一小部分。一旦成功测试&#xff0c;就可以试试desk数据集&#xff0c;它包含四张桌子和几个闭环…

C语言的学习小结——数组

一、一维数组的创建与初始化 1、格式&#xff1a; type_t arr_name[const_n];//type_t 是指数组的元素类型 //const_n 是一个常量表达式&#xff0c;用来指定数组的大小 注&#xff1a; 数组是使用下标来访问的&#xff0c;下标从0开始。 数组的大小可以通过计算得到&…

电商平台商品详情接口的应用场景

API接口的定义价格、库存量、发货地点等。此外&#xff0c;它还可以提供商品的详细信息&#xff0c;包括商品的图片、详细描述、规格参数、售后服务等。这些信息可以帮助用户更好地了解商品&#xff0c;从而更好地选择商品。其次&#xff0c;电商平台商品详情接口的实现原理是基…

使用Chemistry Development Kit (CDK) 来进行化学SMILES子结构匹配

摘要 SMILES是一种用于描述化合物结构的字符串表示法&#xff0c;其中子结构搜索是在大规模化合物数据库中查找特定的结构。然而&#xff0c;这种搜索方法存在一个误解&#xff0c;即将化合物的子结构视为一个独立的实体进行搜索&#xff0c;而忽略了它们在更大的化合物中的上…

极光笔记 | 埋点体系建设与实施方法论

PART 01 前 言随着网络技术的发展&#xff0c;从粗犷型到精细化运营型&#xff0c;再到现在的数字化运营&#xff0c;数据变得越来越细分和重要&#xff0c;不仅可以进行策略调整&#xff0c;还可以实现自动化的精细化运营。而数据价值的起点就是埋点&#xff0c;只有合理地埋点…

lammps教程:Ovito选择特定晶粒的方法

大家好&#xff0c;我是小马老师。 本文介绍如何使用ovito提取特定的晶粒。 在多晶的lammps模拟中&#xff0c;可能会对某一个特定晶粒的变形情况进行分析&#xff0c;此时&#xff0c;需要找到这个晶粒&#xff0c;并进行单独分析。 ovito有专用的晶粒识别命令&#xff0c;…

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题&#xff08;25分&#xff09;2022上案例分析历年真题第二题&#xff08;25分&#xff09;2022上案例分析历年真题第…

RocketMQ 5.x新版本部署优化一览

​ RocketMQ从2022年9月份开始推出了新的5.x大版本。相比于之前的4.x版本&#xff0c;5.x版本向云原生前进了一大步。在增强原因功能的基础上&#xff0c;更是支持多语言客户端&#xff0c;周边生态也进行了补强和完善&#xff0c;明显可以看到离Kafka老大哥又近了很大一步。 …

由Geoscene Enterprise 2.1 升级至Geoscene Enterprise 3.1

文章目录一、升级前工作二、升级Geoscene portal三、升级Web Adaptor&#xff08;针对portal门户&#xff09;四、升级Server 站点&#xff08;作为门户托管服务器&#xff09;五、升级Web Adaptor&#xff08;针对server&#xff09;六、升级Data Store需求&#xff1a;由GeoS…