快速开发工作流_01_简单流程案例

文章目录

  • 一、介绍
  • 二、技术选型
  • 三、登录/绘制流程图
    • 3.1. 需要先登录
    • 3.2. 绘制流程图
  • 四、 使用说明
    • 4.1. 选择数据库
    • 4.2. 增加 mybatis, modeler,idm 等配置
    • 4.3. yml 文件配置
  • 五、定义流程文件
        • 这样当此框架启动的时候它会默认加载resource目录下的processes时就可以将此流程配置加载到数据库进行持久化了
  • 六、验证测试controller
        • 测试请求

一、介绍

springboot-flowable-modeler 快速开发工作流脚手架

二、技术选型

SpringBoot + flowable + modeler + idm

框架版本
SpringBoot2.1.5.RELEASE
flowable6.4.0
mysql8.0.11

三、登录/绘制流程图

3.1. 需要先登录

链接http://127.0.0.1:80/expense/idm/index.html
用户名admin
密码test

login頁面

3.2. 绘制流程图

再访问: http://127.0.0.1:80/expense 创建设计器
login頁面
login頁面
login頁面
login頁面
login頁面
login頁面

四、 使用说明

4.1. 选择数据库

将flowable的依赖加入到POM中即可,flowable使用需要一个数据库,这里为了方便我选择mysql

4.2. 增加 mybatis, modeler,idm 等配置

 <properties><java.version>1.8</java.version><flowable.version>6.4.0</flowable.version><mybatis-spring-boot>1.3.1</mybatis-spring-boot></properties><dependencies><!--springmvc启动器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--flowable工作流依赖--><dependency><groupId>org.flowable</groupId><artifactId>flowable-spring-boot-starter-basic</artifactId><version>${flowable.version}</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><!-- Spring Boot Mybatis 依赖 --><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis-spring-boot}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.31</version></dependency><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.46</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-ui-common</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-ui-modeler-rest</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-idm-spring-configurator</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-ui-idm-rest</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.flowable</groupId><artifactId>flowable-ui-idm-conf</artifactId><version>${flowable.version}</version></dependency><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>3.6.2</version></dependency><!--security --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-crypto</artifactId></dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId></dependency><!-- Servlet --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

4.3. yml 文件配置

增加: idm, modeler , mybatis , servlet 等配置

#端口 请求url
server:port: 80servlet:context-path: /expense
#数据库 url classname user password
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/springboot-flowable-modeler?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=CTTusername: rootpassword: rootsecurity:filter:dispatcher-types: REQUEST,FORWARD,ASYNC
#在线流程图设计
flowable:#关闭定时任务JOBasync-executor-activate: falsecommon:app:idm-url: http://localhost:80/expense/idm:app:admin:user-id: adminpassword: testfirst-name: adminlast-name: adminrest:app:authentication-mode: verify-privilegemodeler:app:rest-enabled: truedatabase-schema-update: true
mybatis:mapper-locations: classpath:/META-INF/modeler-mybatis-mappings/*.xmlconfig-location: classpath:/META-INF/mybatis-config.xmlconfiguration-properties:prefix:blobType: BLOBboolValue: TRUE

这样操作后,flowable与springBoot的整个就完成了!

然后就可以运行了,初次运行时flowable会将自动执行flowable中的初始化脚本完成工作流所需要的数据表的建立,如果指定的数据库中还未创建过flowable的相关数据表的话。

五、定义流程文件

ExpenseProcess.bpmn20.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: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="Expense" name="ExpenseProcess" isExecutable="true"><documentation>报销流程</documentation><startEvent id="start" name="开始"></startEvent><userTask id="fillTask" name="出差报销" flowable:assignee="${taskUser}"><extensionElements><modeler:initiator-can-complete xmlns:modeler="http://flowable.org/modeler"><![CDATA[false]]></modeler:initiator-can-complete></extensionElements></userTask><exclusiveGateway id="judgeTask"></exclusiveGateway><userTask id="directorTak" name="经理审批"><extensionElements><flowable:taskListener event="create"class="com.haiyang.flowable.listener.ManagerTaskHandler"></flowable:taskListener></extensionElements></userTask><userTask id="bossTask" name="老板审批"><extensionElements><flowable:taskListener event="create"class="com.haiyang.flowable.listener.BossTaskHandler"></flowable:taskListener></extensionElements></userTask><endEvent id="end" name="结束"></endEvent><sequenceFlow id="directorNotPassFlow" name="驳回" sourceRef="directorTak" targetRef="fillTask"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='驳回'}]]></conditionExpression></sequenceFlow><sequenceFlow id="bossNotPassFlow" name="驳回" sourceRef="bossTask" targetRef="fillTask"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='驳回'}]]></conditionExpression></sequenceFlow><sequenceFlow id="flow1" sourceRef="start" targetRef="fillTask"></sequenceFlow><sequenceFlow id="flow2" sourceRef="fillTask" targetRef="judgeTask"></sequenceFlow><sequenceFlow id="judgeMore" name="大于500元" sourceRef="judgeTask" targetRef="bossTask"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${money > 500}]]></conditionExpression></sequenceFlow><sequenceFlow id="bossPassFlow" name="通过" sourceRef="bossTask" targetRef="end"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='通过'}]]></conditionExpression></sequenceFlow><sequenceFlow id="directorPassFlow" name="通过" sourceRef="directorTak" targetRef="end"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${outcome=='通过'}]]></conditionExpression></sequenceFlow><sequenceFlow id="judgeLess" name="小于500元" sourceRef="judgeTask" targetRef="directorTak"><conditionExpression xsi:type="tFormalExpression"><![CDATA[${money <= 500}]]></conditionExpression></sequenceFlow></process><bpmndi:BPMNDiagram id="BPMNDiagram_Expense"><bpmndi:BPMNPlane bpmnElement="Expense" id="BPMNPlane_Expense"><bpmndi:BPMNShape bpmnElement="start" id="BPMNShape_start"><omgdc:Bounds height="30.0" width="30.0" x="285.0" y="135.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="fillTask" id="BPMNShape_fillTask"><omgdc:Bounds height="80.0" width="100.0" x="405.0" y="110.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="judgeTask" id="BPMNShape_judgeTask"><omgdc:Bounds height="40.0" width="40.0" x="585.0" y="130.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="directorTak" id="BPMNShape_directorTak"><omgdc:Bounds height="80.0" width="100.0" x="735.0" y="110.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="bossTask" id="BPMNShape_bossTask"><omgdc:Bounds height="80.0" width="100.0" x="555.0" y="255.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNShape bpmnElement="end" id="BPMNShape_end"><omgdc:Bounds height="28.0" width="28.0" x="771.0" y="281.0"></omgdc:Bounds></bpmndi:BPMNShape><bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1"><omgdi:waypoint x="315.0" y="150.0"></omgdi:waypoint><omgdi:waypoint x="405.0" y="150.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2"><omgdi:waypoint x="505.0" y="150.16611295681062"></omgdi:waypoint><omgdi:waypoint x="585.4333333333333" y="150.43333333333334"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="judgeLess" id="BPMNEdge_judgeLess"><omgdi:waypoint x="624.5530726256983" y="150.44692737430168"></omgdi:waypoint><omgdi:waypoint x="735.0" y="150.1392757660167"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="directorNotPassFlow" id="BPMNEdge_directorNotPassFlow"><omgdi:waypoint x="785.0" y="110.0"></omgdi:waypoint><omgdi:waypoint x="785.0" y="37.0"></omgdi:waypoint><omgdi:waypoint x="455.0" y="37.0"></omgdi:waypoint><omgdi:waypoint x="455.0" y="110.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="bossPassFlow" id="BPMNEdge_bossPassFlow"><omgdi:waypoint x="655.0" y="295.0"></omgdi:waypoint><omgdi:waypoint x="771.0" y="295.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="judgeMore" id="BPMNEdge_judgeMore"><omgdi:waypoint x="605.4340277777778" y="169.56597222222223"></omgdi:waypoint><omgdi:waypoint x="605.1384083044983" y="255.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="directorPassFlow" id="BPMNEdge_directorPassFlow"><omgdi:waypoint x="785.0" y="190.0"></omgdi:waypoint><omgdi:waypoint x="785.0" y="281.0"></omgdi:waypoint></bpmndi:BPMNEdge><bpmndi:BPMNEdge bpmnElement="bossNotPassFlow" id="BPMNEdge_bossNotPassFlow"><omgdi:waypoint x="555.0" y="295.0"></omgdi:waypoint><omgdi:waypoint x="455.0" y="295.0"></omgdi:waypoint><omgdi:waypoint x="455.0" y="190.0"></omgdi:waypoint></bpmndi:BPMNEdge></bpmndi:BPMNPlane></bpmndi:BPMNDiagram>
</definitions>

其中的两个代理类为:

package com.gblfy.flowable.listen;import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;/*** @Author: gblfy* @Description:* @Date: Create in in 2019/11/03 10:26*/
public class ManagerTaskHandler implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {delegateTask.setAssignee("经理");}
}
package com.gblfy.flowable.listen;import org.flowable.engine.delegate.TaskListener;
import org.flowable.task.service.delegate.DelegateTask;/*** @Author: gblfy* @Description:* @Date: Create in in 2019/11/03 10:26*/
public class BossTaskHandler implements TaskListener {@Overridepublic void notify(DelegateTask delegateTask) {delegateTask.setAssignee("老板");}
}

尽管上面的BPMN文件很长,但放心,毕竟那是通过相关的工具生成出来的,对于核心的逻辑部分也很少(主要在process 标签内) ,如需要详细了解的可自行学习下BPMN的标签即可!当然,在flowable的使用文档中也有相关的描述,详见:Creating a ProcessEngine
流程图

这样当此框架启动的时候它会默认加载resource目录下的processes时就可以将此流程配置加载到数据库进行持久化了

六、验证测试controller

为了方便这里通过一个controller来完成此DEMO的快速编写

@Controller
@RequestMapping(value = "expense")
public class ExpenseController {@Autowiredprivate RuntimeService runtimeService;@Autowiredprivate TaskService taskService;@Autowiredprivate RepositoryService repositoryService;@Autowiredprivate ProcessEngine processEngine;/***************此处为业务代码******************/
}
/*** 添加报销** @param userId    用户Id* @param money     报销金额* @param descption 描述*/@RequestMapping(value = "add")@ResponseBodypublic String addExpense(String userId, Integer money, String descption) {//启动流程HashMap<String, Object> map = new HashMap<>();map.put("taskUser", userId);map.put("money", money);ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("Expense", map);return "提交成功.流程Id为:" + processInstance.getId();}
/*** 获取审批管理列表*/@RequestMapping(value = "/list")@ResponseBodypublic Object list(String userId) {List<Task> tasks = taskService.createTaskQuery().taskAssignee(userId).orderByTaskCreateTime().desc().list();for (Task task : tasks) {System.out.println(task.toString());}return tasks.toArray().toString();}
/*** 批准** @param taskId 任务ID*/@RequestMapping(value = "apply")@ResponseBodypublic String apply(String taskId) {Task task = taskService.createTaskQuery().taskId(taskId).singleResult();if (task == null) {throw new RuntimeException("流程不存在");}//通过审核HashMap<String, Object> map = new HashMap<>();map.put("outcome", "通过");taskService.complete(taskId, map);return "processed ok!";}
 /*** 拒绝*/@ResponseBody@RequestMapping(value = "reject")public String reject(String taskId) {HashMap<String, Object> map = new HashMap<>();map.put("outcome", "驳回");taskService.complete(taskId, map);return "reject";}
 /*** 生成流程图** @param processId 任务ID*/@RequestMapping(value = "processDiagram")public void genProcessDiagram(HttpServletResponse httpServletResponse, String processId) throws Exception {ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processId).singleResult();//流程走完的不显示图if (pi == null) {return;}Task task = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();//使用流程实例ID,查询正在执行的执行对象表,返回流程实例对象String InstanceId = task.getProcessInstanceId();List<Execution> executions = runtimeService.createExecutionQuery().processInstanceId(InstanceId).list();//得到正在执行的Activity的IdList<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);OutputStream out = null;byte[] buf = new byte[1024];int legth = 0;try {out = httpServletResponse.getOutputStream();while ((legth = in.read(buf)) != -1) {out.write(buf, 0, legth);}} finally {if (in != null) {in.close();}if (out != null) {out.close();}}} 

通过传入流程ID生成当前流程的流程图给前端,如果流程中使用到中文且生成的图片是乱码的,则需要进配置下字体:

package com.gblfy.flowable.config;import org.flowable.spring.SpringProcessEngineConfiguration;
import org.flowable.spring.boot.EngineConfigurationConfigurer;
import org.springframework.context.annotation.Configuration;/*** @Author: gblfy* @Description: 为放置生成的流程图中中文乱码* @Date: Create in 2019/11/03 10:26*/
@Configuration
public class FlowableConfig implements EngineConfigurationConfigurer<SpringProcessEngineConfiguration> {@Overridepublic void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {springProcessEngineConfiguration.setActivityFontName("宋体");springProcessEngineConfiguration.setLabelFontName("宋体");springProcessEngineConfiguration.setAnnotationFontName("宋体");}
}

测试请求

1.先启动好此项目,然后创建一个流程:
访问:http://localhost:80/expense/add?userId=123&money=123321

返回:提交成功.流程Id为:2b29876c-fde9-11e9-b75f-f8a2d6bfea5a

流程图

2.查询待办列表:

访问:http://localhost:80/expense/list?userId=123

输出:Task[id=2b30da72-fde9-11e9-b75f-f8a2d6bfea5a, name=出差报销]
流程图

3.同意:

注意 : 带的是taskid

访问:http://localhost:80/expense/apply?taskId=2b30da72-fde9-11e9-b75f-f8a2d6bfea5a

返回:processed ok!
流程图
4.生成流程图:

访问: http://localhost:80/expense/processDiagram?processId=2b29876c-fde9-11e9-b75f-f8a2d6bfea5a

流程图
项目源码
码云地址:
https://gitee.com/gb_90/springboot-flowable-modeler

接下一篇:快速开发工作流_02_集成在线流程设计器
https://gblfy.blog.csdn.net/article/details/103676784

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

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

相关文章

Spark精华问答 | Spark和Hadoop的架构区别解读

总的来说&#xff0c;Spark采用更先进的架构&#xff0c;使得灵活性、易用性、性能等方面都比Hadoop更有优势&#xff0c;有取代Hadoop的趋势&#xff0c;但其稳定性有待进一步提高。我总结&#xff0c;具体表现在如下几个方面。1Q&#xff1a;Spark和Hadoop的架构区别A&#x…

7类合作伙伴,190条沟通路径,高德汽车如何实现组织高效沟通?

摘要&#xff1a; 通常协同开发组织或团队大于等于7&#xff0c;关键干系人大于等于10&#xff0c;组织级沟通路径大于等于21条&#xff0c;关键干系人沟通路径大于等于45条&#xff0c;并以较大角系数递增。这种沟通路径曲线下&#xff0c;如何让组织信息快速传递&#xff1f;…

MaxCompute - ODPS重装上阵 第二弹 - 新的基本数据类型与内建函数

摘要&#xff1a; MaxCompute&#xff08;原ODPS&#xff09;是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用&#xff0c;支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外&#xff0c;也致力于提升SQL语言的用户体验和表达能力…

@程序员:可以被认出是写代码的,但是不能因为格子衬衫!

戳蓝字“CSDN云计算”关注我们哦&#xff01;亲爱的&#xff0c;我今天穿什么衣服比较好呢&#xff1f;你女朋友早上是否也会站在试衣镜前这样询问你&#xff1f;醒醒&#xff0c;你哪里有女朋友&#xff01;你分得清人家衣服的&#xff1f;比如&#xff1a;裤子&#xff1a;背…

助力全站WebP ,阿里云云上FPGA 团队发布 WebP图片解决方案

摘要&#xff1a; 阿里云 WebP 图片解决方案的软件部分由联捷计算科技&#xff08;CTAccel&#xff09;提供&#xff0c;再整合上阿里云自身的FaaS (FPGA as a Service) 弹性计算平台&#xff0c;形成了完整的阿里云 WebP 图片解决方案。 点此查看原文 目前来说&#xff0c;图片…

linux ssh连接交换机_访问SMB交换机CLI使用SSH或远程登录

访问SMB交换机CLI使用SSH或远程登录客观Cisco小型企业被管理的交换机可以通过命令行界面(CLI)远程访问和被配置。访问CLI在一个基于终端的窗口允许命令被输入。如果喜欢配置使用在您的交换机的终端命令通过CLI而不是基于Web的工具&#xff0c;这是一个更加容易的选择。某些任务…

面试官问我:你们的数据库是怎么架构的?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者&#xff1a;尜尜人物来源&#xff1a;https://www.cnblogs.com/littlecharacter/p/9084291.html一、数据库架构原则高可用高性能一致性扩展性二、常见的架构方案方案一&#xff1a;主备架构&#xff0c;只有主库提供读写服务&a…

一张图学会数据库迁云最佳路径

摘要&#xff1a; 我们以基于Oracle数据库的应用系统上云为例&#xff0c;如何根据实际需求&#xff0c;及不同的应用特征&#xff0c;去选择合适的上云解决方案&#xff1f;看懂了以下这张图&#xff0c;就能找到最适合你的应用系统总体的迁移上云路径。 点此查看原文 传统架构…

透析《长安十二时辰》里的望楼,人类在唐朝就有 5G 愿望了?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 胡巍巍出品 | 程序人生&#xff08;ID&#xff1a;coder_life&#xff09;《古都24小时》哦不《长安十二时辰》&#xff0c;让很多人跟着易烊千玺和雷佳音&#xff0c;回了趟大唐&#xff01;为了体现真实&#xff0c;剧中大…

MaxCompute - ODPS重装上阵 第三弹 - 复杂类型

摘要&#xff1a; MaxCompute&#xff08;原ODPS&#xff09;是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用&#xff0c;支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外&#xff0c;也致力于提升SQL语言的用户体验和表达能力…

ecplise安装flowable插件

ecplise安装flowable插件步骤&#xff1a; Help ---- > Install New Software ---- > add, 然后添加的弹窗中输入以下信息&#xff1a; Name: Flowable BPMN 2.0 designerLocation: http://flowable.org/designer/update/创建一个maven项目测试一下:

OpenStack精华问答 | OpenStack和CloudStack对比

自诞生以来&#xff0c;OpenStack 似乎一直被质疑&#xff0c;其背后最重要的两大推手 NASA 和 Rackspace 都弃它而去&#xff0c;惠普、思科接连宣布关闭基于 OpenStack 的公有云服务&#xff0c;但是,OpenStack 依旧坚挺。1Q&#xff1a;OpenStack发展历史A:2Q&#xff1a;op…

基于TableStore/MaxCompute的数据采集分析系统介绍

摘要 在互联网高度发达的今天&#xff0c;ipad、手机等智能终端设备随处可见&#xff0c;运行在其中的APP、网站也非常多&#xff0c;如何采集终端数据进行分析&#xff0c;提升软件的品质非常重要&#xff0c;例如PV/UV统计、用户行为数据统计与分析等。虽然场景简单&#xf…

第3篇:Flowable-IDM详述

接上一篇&#xff1a; 第2篇&#xff1a;Flowable启动 https://blog.csdn.net/weixin_40816738/article/details/102875324 文章目录一、Flowable-IDM功能二、Flowable-IDM登录地址三、Flowable-IDM登录用户和页面四、Flowable-IDM用户管理页面五、Flowable-IDM用户组管理页面六…

比“5G有多快”更重要的,是5G将带来哪些改变

戳蓝字“CSDN云计算”关注我们哦&#xff01;“速度&#xff0c;其实是5G最无聊的应用。”北京邮电大学20岁的何同学&#xff0c;在他制作的一个火遍全网的视频中&#xff0c;用这句话结尾。5G&#xff0c;对我们普通人而言&#xff0c;是个熟悉又陌生的词。由于它是中美贸易战…

阿里云新推出 HiTSDB + IoT套件 物联网设备上云步入快车道

摘要&#xff1a; 阿里云针对物联网企业遇到的5大痛点&#xff0c;提供了HiTSDB IoT 套件的一体化解决方案&#xff0c;能够支持物联设备快速上云&#xff0c;高效设备管理&#xff0c;数据安全&#xff0c;低成本海量数据存储&#xff0c;实时掌握设备状态&#xff0c;快速发现…

阿里云 MVP技术直播——缪政辉教你如何搭建万能LNMP环境

摘要&#xff1a; 阿里云 MVP 缪政辉开直播咯&#xff01;快把这个好消息告诉你身边热爱技术&#xff0c;喜欢云计算的同学&#xff01; 缪政辉是谁&#xff1f; 网名妙正灰&#xff0c;真名和网名读法一致。阿里云第三季新晋MVP&#xff0c;电商在读大学生。云计算领域罕见的文…

第4篇:Flowable-Modeler详述之流程概述

接上一篇 第3篇&#xff1a;Flowable-IDM详述 https://blog.csdn.net/weixin_40816738/article/details/102885902 文章目录一、Flowable-Modeler功能1. 提供可视化编辑器2. 提供可视化参数配置3. 提供导入导出功能二、Flowable-Modeler界面之流程介绍三、Flowable-Modeler之创…

MaxCompute - ODPS重装上阵 第四弹 - CTE,VALUES,SEMIJOIN

摘要&#xff1a; MaxCompute&#xff08;原ODPS&#xff09;是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用&#xff0c;支撑了多个BU的核心业务。 MaxCompute除了持续优化性能外&#xff0c;也致力于提升SQL语言的用户体验和表达能力…

Kubernetes端到端解决方案Part3:如何正确部署Kubernetes

戳蓝字“CSDN云计算”关注我们哦&#xff01;在之前的文章中我们向您介绍了Kubernetes的入门挑战以及如何执行端到端的即服务解决方案。本篇文章&#xff0c;我们将继续探讨如何正确部署Kubernetes&#xff0c;并探索服务编排解决方案。01如何正确部署Kubernetes?在我们进一步…