一、写在前面

最近看到一个新闻,讲的湖南的一位卖菜阿姨火了。她的生意,比其他菜摊好得多,赚得也多得多。归根结底是她懂得抓住年轻人的痛点。这位卖菜的阿姨发现自己的孩子因为工作忙碌,经常不在家做饭,常常叫外卖。但这些外卖吃多了,其实对身体非常不好。阿姨就在自己的卖菜摊上,开了一周菜单服务。年轻人嫌麻烦,阿姨帮年轻人菜洗好、切好、搭配好,只要回去简单炒一下就可以了。而且还附送调料,傻瓜级的做饭教程。让我想到《无双》当中发哥的一句台词“任何事情,做到极致就是艺术。”这也是我一直在践行低代码的原因,把自己的专业做到极致,在这一领域里深根下去。当然我没有特意去吹捧低代码如何如何的好,但对我们技术人员来说确实可以提高效率,进而为企业去创造更大的价值。

二、业务流程引擎方案

在之前的文章里陆续介绍了关于规则引擎解决促销类问题、数据权限等问题,但你会发现其实这些仅仅只是冰山一角,即使是对于一个简单的业务场景都不能实现,因为再简单的业务其实都是有一个流程的概念,如何抽象这些流程,变成通用的框架、中间件等才是我们需要不断去思考的问题。优秀的思想总是来源于经验的累积,知识的积淀,加上不断的思考,我们身处在这个伟大的时代,总是可以借鉴一些前人总结的宝贵经验来提升我们自己的认知。在项目当中主要是用了spring batch 框架来处理定时任务的业务流,刚开始在用的时候也很方便,舒服,但随着业务的发展,想要新加一个类似的流程,都需要通过编码来实现,很多工作都是重复的,实在受不了这样的方式,效率太低下,经过近半个月的调研,思考,最后终于完成了相对比较满意的流程方案,今天主要跟大家分享下思路。

如果你对spring batch 还不甚了解的话,可以先网上找些资料熟悉下,接下来讲的一些名词概念需要你对它有一定的基础。首先来看张架构图:

低代码-业务流程引擎-LMLPHP

对我们来说最重要的就是Step,它又细分为tasklet和chunk,这也是我们目前使用最多的两种方式,我也参考batch的思想,在我的设计方案里,流程的每个节点Node为一个Step,根据Node类型动态生成tasklet和chunk,然后在每一个tasklet/chunk里又有我自己定义的step概念,每一个step执行一个动作,如取数、更新、过滤、ftp推送等等,这样其实通过spring batch 框架已经把我们的业务流程串联起来了。以上也是我们基于batch 自研的业务流程引擎的核心内容。

三、业务流程引擎实践

有了上面初步的思想,接下来就是落地实践的过程了,此部分主要分享下在落地过程中遇到的一些问题。首先是job如何动态配置,这个问题处理相对有点难度,一开始想看下网上是否有人想过类似的实现,就去搜索了下,还真有人提过相似的问题,但没有解决方案,基本没人回复。接下来就只能靠自己来想了,对我而言,我只需要解决怎么样才能够动态的添加Step即可,因为我的每一个节点是配置出来的,在上一部分我们知道,节点Node就是一个 batch 的Step,只能在job配置的时候,动态的获取配置的节点,然后动态加载Step:

低代码-业务流程引擎-LMLPHP

低代码-业务流程引擎-LMLPHP

最后

jobBuilder.build()
返回创建的job。

以上算是解决了动态载入job的解决方案。接下来却遇到了更麻烦的问题,在我的方案中,在job启动的时候可以关联多个流程的,需要把多个job注入到容器中,直接上代码:

低代码-业务流程引擎-LMLPHP

在for 循环中,把返回的job实例先缓存起来,当容器启动成功后,再注册到容器中:

低代码-业务流程引擎-LMLPHP

到目前为止,已经支持动态载入job,且多个job注册。细心的朋友应该可能发现了问题,我们的流程都是动态配置的,当系统正常运行后,新配置的流程如何加载进来,并运行呢?这个问题的求解也容易,有了上面一个问题的经验,我们是动态注入bean到容器中的,那此时我们只需要动态的刷新的bean就好了。这个问题留给你们啦,有兴趣的自行尝试下。

四、总结

以上其实只是好玩的一小部分,当然也会遇到好多的问题,但想法总比问题多,低代码的实践过程中更有许多有趣好玩的编程思想在尝试,更重要的是整个团队都在成长。

低代码-业务流程引擎-LMLPHP

04-17 20:48