前言

首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来]的支持。

分享一下近期我对这个项目的一些改进。

问题&改进

问题1:

流程运行开始后,异步执行,无法同步等待流程运行结束。

改进方法:
修正后流程(黄色部分为修改点):

调用代码:

// 异步调用(默认)
flow.start();
// 或者
flow.start(false); // 同步调用
flow.start(true);

问题2:

工程需要自己下载编译,无法自动引用。

改进方法:

将代码发布到maven仓库,然后可以用下面的方法调用:

Maven
<!-- https://mvnrepository.com/artifact/io.github.nobuglady/ladybugflow -->
<dependency>
<groupId>io.github.nobuglady</groupId>
<artifactId>ladybugflow</artifactId>
<version>0.0.1</version>
</dependency>
Gradle
// https://mvnrepository.com/artifact/io.github.nobuglady/ladybugflow
implementation 'io.github.nobuglady:ladybugflow:0.0.1'

发布到maven仓库遇到的坑:

1. 自动发布到maven仓库后,无法release。

首先,在创建了maven仓库的账号,并且完成相关配置后,发布流程如下

a) 执行命令 mvn clean deploy

b) 登录sonatype仓库,选择Staging Repository,将发布的工程选中,选择close。

c) 登录sonatype仓库,选择Staging Repository,将发布的工程选中,选择release。

我遇到的问题:

步骤a)执行完毕正常结束后,在sonatype仓库中,在Staging Repository中看不到自己的工程。

但是搜索自己的工程可以看到已经上传的文件,也可以删除(release状态的文件应该不能删除)。

所以判断是没有自动release,但也没法手工release,也没有任何错误提示。

解决方法:

本地打包,手工将bundle.jar上传到Staging Repository,这样可以看到中间状态文件出的问题。

果然,在手工上传成功后,自动运行的一些校验提示了一些pom文件问题,这可能是导致之前没有自动release的原因。

本地打包方法:

a) 执行

mvn release:clean release:prepare

b) 在target目录会看到类似下面的文件

ladybugflow-0.0.2.jar
ladybugflow-0.0.2.jar.asc
ladybugflow-0.0.2.pom
ladybugflow-0.0.2.pom.asc
ladybugflow-0.0.2-javadoc.jar
ladybugflow-0.0.2-javadoc.jar.asc
ladybugflow-0.0.2-sources.jar
ladybugflow-0.0.2-sources.jar.asc

c)进入到target目录,运行下面命令来打包

jar -cvf bundle.jar ladybugflow*

d)将打包好的jar文件手工上传到sonatype仓库

e)在sonatype仓库等待自己上传的文件到close状态,检查没问题后,选择release。

2. 提示 can not upload bundle Because is xxxx is a RELEASE repository

解决方法:

在pom.xm的版本号中加入-SNAPSHOT,比如

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>io.github.nobuglady</groupId>
<artifactId>ladybugflow</artifactId>
<packaging>jar</packaging>
<version>0.0.2-SNAPSHOT</version>
<name>ladybugflow</name>
......

项目优点

优点,也是难点,但不是亮点。设计过程复杂(花了很长时间做改进),设计结果的话又极其简单(光看结果甚至会认为这个设计花不了一天)。

这种流程图设计的最大问题就是流程图状态的更新,比如等待前面的一个或多个节点运行结束后,启动自身节点。

第一版:每个节点提交到线程池后留下Future句柄,存起来。

后续节点运行前检查前面所有join到自己节点的Future句柄,是否完成。

可以阻塞检查,也可以sleep循环检查。

问题:

看似解决了问题,但隐患多多,比如所有的Future句柄都要存起来,那就涉及到这些东东的管理问题,想起来又兴奋又头大。

还有检查的时候是阻塞检查,还是sleep循环检查,还是。。。还是给每个节点加一个计数器,计数器清零则触发本节点执行。。。

改进:

将多线程转化为单线程或者可控的几个线程,把图(流程图)单独管理。

简单的说,是一个人(一个逻辑)单独的只负责更新图,根据每个节点的状态更新图。更新图后,输出后续要运行的节点给调用者。

这样就将节点运行,流程图状态分开管理。更新图的流程入口和出口分别对应两个队列:

入口:运行完毕的节点队列
出口:将要运行的节点队列

更新图的流程监听入口,得到一个消息(节点运行完毕)后,更新该节点对应的流程图,然后将后续要运行的节点输出给出口(将要运行的队列)。

节点的运行逻辑监听出口队列,然后怎么运行节点都可以了,在本地,在远程,在云端都无所谓,只要节点运行后告知入口队列,自己运行完毕,

则流程图会自动更新,并且往出口上发消息(后续要运行的节点),如下图所示:

这样设计的优点:

将多线程转化为单线程或者有限的几个线程处理,避免了高并发编程带来的各种问题和风险。

可以自由对流程图模块进行升级,比如每条边加条件,根据条件进行更新,异常后对流程的更新,根据节点返回值进行更新,绑定动态逻辑等等,我可以专心的设计路程图更新的方法,不用考虑节点运行的事情。实现了流程图更新自由。

可以自由对节点运行模块进行升级,云端运行,api调用运行,shell运行,本地运行,分布式集群运行等等,不用考虑流程图怎么更新的问题。实现了节点运行自由。

感谢您看文章读到这里。

最后

源码:https://github.com/nobuglady/ladybugflow

业务可视化-让你的流程图"Run"起来(2.问题与改进)的更多相关文章

  1. 业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)

    前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(2.问题与改进)]的支持. 分享一下近期我对这个项目的一些改进. 1. 增加了分支选择工程,可以根据节点的 ...

  2. 业务可视化-让你的流程图"Run"起来(4.实际业务场景测试)

    前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(3.分支选择&跨语言分布式运行节点)]的支持. 下面我以实际业务场景为例,来介绍一下ladybug ...

  3. 业务可视化-让你的流程图"Run"起来(6.定时任务&Spring-Batch的集成)

    前言 首先,感谢大家对上一篇文章[业务可视化-让你的流程图"Run"起来(5.SpringBoot集成&微服务编排)]的支持. 分享一下近期我对这个项目的一些改进. 在项目 ...

  4. 业务可视化-让你的流程图"Run"起来

    前言 最近在研究业务可视化的问题,在日常的工作中,流程图和代码往往是分开管理的. 一个被维护多次的系统,到最后流程图和代码是否匹配这个都很难说. 于是一直有一个想法,让程序直接读流程图,根据流程图的配 ...

  5. 业务流程可视化-让你的流程图"Run"起来(7.运行状态持久化&轻量工作流支持)

    前言 感谢大家阅读本项目系列文章和对项目的支持.分享一下我对这个项目的新的改进. 之前项目做到了流程设计可视化和流程运行结果可视化. 本期发布的版本中实现了中间的运行过程的实时可视化,和流程状态持久化 ...

  6. 可视化图表库--goJS

    GoJS是Northwoods Software的产品.Northwoods Software创立于1995年,专注于交互图控件和类库.旗下四款产品: GoJS:用于在HTML上创建交互图的纯java ...

  7. 线程中start和run方法的区别

    先说java中实现多线程常用的两种方式:   1:继承Thread类,并重写run()方法   2:实现Runnable接口,实现run方法实际上Thread类也是实现了Runnable接口 [Jav ...

  8. 近期业务大量突增微服务性能优化总结-3.针对 x86 云环境改进异步日志等待策略

    最近,业务增长的很迅猛,对于我们后台这块也是一个不小的挑战,这次遇到的核心业务接口的性能瓶颈,并不是单独的一个问题导致的,而是几个问题揉在一起:我们解决一个之后,发上线,之后发现还有另一个的性能瓶颈问 ...

  9. Cesium和Kaarta用高分辨率激光雷达可视化室内和地下环境

    Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Cesium使急救人员和军事操作人员更容易快速评估和了解密集和不 ...

随机推荐

  1. vue项目中cookie的使用

    Vue使用cookie和session 1:cookie和session 为了防止数据运输或存储终端,特地设置了cookie和session,他们其实都是将数据存储当地. cookie数据保存在客户端 ...

  2. Redis 内存满了怎么办?这样设置才正确!

    上回在<Redis 数据过期了会被立马删除么?>说到如果过期的数据太多,定时删除无法删除完全(每次删除完过期的 key 还是超过 25%),同时这些 key 再也不会被客户端请求,就无法走 ...

  3. SpringBoot扩展点EnvironmentPostProcessor

    一.背景 之前项目中用到了Apollo配置中心,对接Apollo配置中心后,配置中心的属性就可以在程序中使用了,那么这个是怎么实现的呢?配置中心的属性又是何时加载到程序中的呢?那么我们如果找到了这个是 ...

  4. vue 常见指令

    vue 常见的指令 v-bind:单向绑定解析表达式可简写为  :xxxx v-model: 双向数据绑定 v-for : 遍历数组/对象/字符串 v-on :绑定事件监听,.可简写为@ v-if : ...

  5. 请收藏,Linux 运维必备的 40 个命令总结,收好了~

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! 1.删除0字节文件 find -type f -size ...

  6. Dapr 不是服务网格,只是我长的和他很像

    概述 我们快速看一遍官方文档:https://docs.dapr.io/concepts/service-mesh/#how-dapr-and-service-meshes-compare ,看看 D ...

  7. Python 散列表查询_进入<哈希函数>为结界的世界

    1. 前言 哈希表或称为散列表,是一种常见的.使用频率非常高的数据存储方案. 哈希表属于抽象数据结构,需要开发者按哈希表数据结构的存储要求进行 API 定制,对于大部分高级语言而言,都会提供已经实现好 ...

  8. vue大型电商项目尚品汇(前台篇)day02

    现在正式回归,开始好好做项目了,正好这一个项目也开始慢慢的开始起色了,前面的准备工作都做的差不多了. 而且我现在也开始慢慢了解到了一些项目才开始需要的一些什么东西了,vuex.router这些都是必备 ...

  9. MongoDB 体系结构与数据模型

    每日一句 If no one else guards the world, then I will come forward. 如果没有别人保卫这个世界,那么我将挺身而出. 概述 MongoDB主要是 ...

  10. 用t-SNE进行流形学习(digits数据集)

    流行学习算法: 是一类用于可视化的算法,它允许进行更复杂的映射,通常也可以给出更好的可视化. t-SNE算法是其中一种. PCA是用于变换数据的首选方法,也可以进行可视化,但它的性质(先旋转然后减少方 ...