Nodeflow4j簡介
Nodeflow4j是本人最近發(fā)布的一個JAVA開源項目,并實(shí)際運(yùn)用于生產(chǎn)項目中。一直想寫一篇中文的介紹七婴,恰好公司美女約稿祟偷,治愈本次的懶癌。
Nodeflow4j是一個輕量基于JSON定義且面象組件開發(fā)的JAVA流程引擎打厘。
主要特性
- JSON定義
和其他的流程引擎基于XML不同修肠,其基于JSON定義在流程配置和定義方面更加簡潔和友好,且流程解析方面性能更佳户盯。
- 面向組件
基于組件化開發(fā)的可以靈活嵌施,可伸縮的配置業(yè)務(wù)流程。包括內(nèi)置的組件莽鸭,還可以自定義自身的組件并在多個業(yè)務(wù)流程中使用吗伤。
如果組件足夠豐富,可以做到零編程或少編程硫眨,就能定義一個新的業(yè)務(wù)處理流程足淆。
- Groovy表達(dá)式
除了語法簡法和親切,Groovy在處理表達(dá)式方面更加強(qiáng)大和高效礁阁。
JSON定義說明
下面是一個JSON定義的樣本巧号,演示表達(dá)式的定義和流程的跳轉(zhuǎn)
{
"indexs":[{"idx":"foo","type":"INT"},
{"idx":"bar","mode":2,"type":"INT"}],
"nodes":[
{"id":"n1","component":"ruleset","ruleset":
["bar=foo*1000","bar+=24"],"next":"n2"},
{"id":"n2","next":[{"condition":"bar==1024","next":"n3"},
{"condition":"bar==2024","next":"n4"},{"next":"n5"}]},
{"id":"n3","component":"testCustomComponent"},
{"id":"n4"},
{"id":"n5"}
]
}
-
indexs - 輸入輸出參數(shù)
ind - 參數(shù)名稱
type - 參數(shù)類型,取值INT,LONG,DOUBLE 或 NUMERIC姥闭,大小寫不敏感
mode - 參數(shù)模式丹鸿,取值1, 2或3分別代表輸入,輸出或即是輸入也是輸出(流程執(zhí)行完的輸出結(jié)果)
-
nodes - 流程結(jié)點(diǎn)
id - 流程上結(jié)點(diǎn)的唯一性ID
component - 組件ID
next - 當(dāng)前結(jié)點(diǎn)的下一個結(jié)點(diǎn). 取值可以是結(jié)點(diǎn)的ID字符串(無條件進(jìn)行下一個結(jié)點(diǎn))或是對象(需進(jìn)行條件判斷)泣栈,當(dāng)取值為對象時, 必須有condition屬性卜高。當(dāng)為對象數(shù)組時,即按數(shù)據(jù)順序進(jìn)行歷遍南片,符合條件時后面的條件不再判斷
內(nèi)置組件
當(dāng)前提供下列內(nèi)置組件掺涛,更多的內(nèi)置組件將會陸續(xù)提供。當(dāng)然你也可以自定義自己的組件
ruleset - 執(zhí)行一組groovy表代式
delay - 執(zhí)行下一個結(jié)點(diǎn)時進(jìn)行延時疼进,默認(rèn)為2秒鐘
開始使用
- 怎么執(zhí)行流程文件
下面是com.github.zzzhan.nodeflow4j.NodeflowTest的代碼片斷, 位于src/test/java薪缆,可直接運(yùn)行并查看結(jié)果。
nfJson = IOUtils.toString(NodeflowTest.class.getResourceAsStream(
"/NodeflowTest.nf"));
Map<String, Object> params = new HashMap<String,Object>();
params.put("foo", 1);
Nodeflow nf = new Nodeflow(nfJson);
nf.execute(params);
assertEquals("n3", nf.getCurNode());
Map<String, Object> output = nf.getOutput();
assertEquals(2048, output.get("bar"));
params.put("foo", 2);
nf = new Nodeflow(nfJson);
nf.execute(params);
assertEquals("n4", nf.getCurNode());
output = nf.getOutput();
assertEquals(2024, output.get("bar"));
params.put("foo", 3);
nf = new Nodeflow(nfJson);
nf.execute(params);
assertEquals("n5", nf.getCurNode());
- 在Spring中使用
請打開模塊nodeflow4j-spring, 并查看里面的使用方式
- Maven
<dependency>
<groupId>com.github.zzzhan</groupId>
<artifactId>nodeflow4j</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
應(yīng)用場景
之前涉及到一些風(fēng)控建模采用了drools(基于JAVA的規(guī)則引擎),暫不說其運(yùn)行效率伞广,其定義配置跟寫程序無異拣帽,對業(yè)務(wù)人員很不友好,維護(hù)很不方便嚼锄,所以才有了Nodeflow4j减拭。
Nodeflow4j可以滿足業(yè)務(wù)流程變動的需求,對流程定義維護(hù)可以快速響應(yīng)区丑。典型的拧粪,可以應(yīng)用于連接多方數(shù)據(jù)修陡,進(jìn)行模型構(gòu)建,如用戶評分可霎、額度測算或交叉驗(yàn)證等等業(yè)務(wù)魄鸦。
當(dāng)然對流程狀態(tài)進(jìn)行持久化,也可以作為工作流引擎的底層實(shí)現(xiàn)癣朗。因此拾因,基于組件化的流程定義在實(shí)際的業(yè)務(wù)流程處理中可以發(fā)揮很大作用。
最后
幫加個星旷余,加星又不會懷孕:https://github.com/zzzhan/nodeflow4j