低代碼-業務流程引擎
- 2022 年 4 月 17 日
- 筆記
一、寫在前面
最近看到一個新聞,講的湖南的一位賣菜阿姨火了。她的生意,比其他菜攤好得多,賺得也多得多。歸根結底是她懂得抓住年輕人的痛點。這位賣菜的阿姨發現自己的孩子因為工作忙碌,經常不在家做飯,常常叫外賣。但這些外賣吃多了,其實對身體非常不好。阿姨就在自己的賣菜攤上,開了一周菜單服務。年輕人嫌麻煩,阿姨幫年輕人菜洗好、切好、搭配好,只要回去簡單炒一下就可以了。而且還附送調料,傻瓜級的做飯教程。讓我想到《無雙》當中發哥的一句台詞「任何事情,做到極致就是藝術。」這也是我一直在踐行低代碼的原因,把自己的專業做到極致,在這一領域裏深根下去。當然我沒有特意去吹捧低代碼如何如何的好,但對我們技術人員來說確實可以提高效率,進而為企業去創造更大的價值。
二、業務流程引擎方案
在之前的文章里陸續介紹了關於規則引擎解決促銷類問題、數據權限等問題,但你會發現其實這些僅僅只是冰山一角,即使是對於一個簡單的業務場景都不能實現,因為再簡單的業務其實都是有一個流程的概念,如何抽象這些流程,變成通用的框架、中間件等才是我們需要不斷去思考的問題。優秀的思想總是來源於經驗的累積,知識的積澱,加上不斷的思考,我們身處在這個偉大的時代,總是可以借鑒一些前人總結的寶貴經驗來提升我們自己的認知。在項目當中主要是用了spring batch 框架來處理定時任務的業務流,剛開始在用的時候也很方便,舒服,但隨着業務的發展,想要新加一個類似的流程,都需要通過編碼來實現,很多工作都是重複的,實在受不了這樣的方式,效率太低下,經過近半個月的調研,思考,最後終於完成了相對比較滿意的流程方案,今天主要跟大家分享下思路。
如果你對spring batch 還不甚了解的話,可以先網上找些資料熟悉下,接下來講的一些名詞概念需要你對它有一定的基礎。首先來看張架構圖:
對我們來說最重要的就是Step,它又細分為tasklet和chunk,這也是我們目前使用最多的兩種方式,我也參考batch的思想,在我的設計方案里,流程的每個節點Node為一個Step,根據Node類型動態生成tasklet和chunk,然後在每一個tasklet/chunk里又有我自己定義的step概念,每一個step執行一個動作,如取數、更新、過濾、ftp推送等等,這樣其實通過spring batch 框架已經把我們的業務流程串聯起來了。以上也是我們基於batch 自研的業務流程引擎的核心內容。
三、業務流程引擎實踐
有了上面初步的思想,接下來就是落地實踐的過程了,此部分主要分享下在落地過程中遇到的一些問題。首先是job如何動態配置,這個問題處理相對有點難度,一開始想看下網上是否有人想過類似的實現,就去搜索了下,還真有人提過相似的問題,但沒有解決方案,基本沒人回復。接下來就只能靠自己來想了,對我而言,我只需要解決怎麼樣才能夠動態的添加Step即可,因為我的每一個節點是配置出來的,在上一部分我們知道,節點Node就是一個 batch 的Step,只能在job配置的時候,動態的獲取配置的節點,然後動態加載Step:
最後
jobBuilder.build()
返回創建的job。
以上算是解決了動態載入job的解決方案。接下來卻遇到了更麻煩的問題,在我的方案中,在job啟動的時候可以關聯多個流程的,需要把多個job注入到容器中,直接上代碼:
在for 循環中,把返回的job實例先緩存起來,當容器啟動成功後,再註冊到容器中:
到目前為止,已經支持動態載入job,且多個job註冊。細心的朋友應該可能發現了問題,我們的流程都是動態配置的,當系統正常運行後,新配置的流程如何加載進來,並運行呢?這個問題的求解也容易,有了上面一個問題的經驗,我們是動態注入bean到容器中的,那此時我們只需要動態的刷新的bean就好了。這個問題留給你們啦,有興趣的自行嘗試下。
四、總結
以上其實只是好玩的一小部分,當然也會遇到好多的問題,但想法總比問題多,低代碼的實踐過程中更有許多有趣好玩的編程思想在嘗試,更重要的是整個團隊都在成長。
歡迎關注