一、寫在前面
最近看到一個新聞,講的湖南的一位賣菜阿姨火了。她的生意,比其他菜攤好得多,賺得也多得多。歸根結底是她懂得抓住年輕人的痛點。這位賣菜的阿姨發現自己的孩子因為工作忙碌,經常不在家做飯,常常叫外賣。但這些外賣吃多了,其實對身體非常不好。阿姨就在自己的賣菜攤上,開了一週選單服務。年輕人嫌麻煩,阿姨幫年輕人菜洗好、切好、搭配好,只要回去簡單炒一下就可以了。而且還附送調料,傻瓜級的做飯教程。讓我想到《無雙》當中發哥的一句臺詞“任何事情,做到極致就是藝術。”這也是我一直在踐行低程式碼的原因,把自己的專業做到極致,在這一領域裡深根下去。當然我沒有特意去吹捧低程式碼如何如何的好,但對我們技術人員來說確實可以提高效率,進而為企業去創造更大的價值。
二、業務流程引擎方案
在之前的文章裡陸續介紹了關於規則引擎解決促銷類問題、資料許可權等問題,但你會發現其實這些僅僅只是冰山一角,即使是對於一個簡單的業務場景都不能實現,因為再簡單的業務其實都是有一個流程的概念,如何抽象這些流程,變成通用的框架、中介軟體等才是我們需要不斷去思考的問題。優秀的思想總是來源於經驗的累積,知識的積澱,加上不斷的思考,我們身處在這個偉大的時代,總是可以借鑑一些前人總結的寶貴經驗來提升我們自己的認知。在專案當中主要是用了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就好了。這個問題留給你們啦,有興趣的自行嘗試下。
四、總結
以上其實只是好玩的一小部分,當然也會遇到好多的問題,但想法總比問題多,低程式碼的實踐過程中更有許多有趣好玩的程式設計思想在嘗試,更重要的是整個團隊都在成長。
歡迎關注