QLExpress使用及源码分析

简介: /

Git仓库:https://github.com/alibaba/QLExpress

1.示例Demo
1.实体构建
2.接口定义
3.脚本编写
表达式内容维护在一个yaml里,默认扫描路径为:classpath*:/rules/**/*.yaml
这里为:user.yaml
2.运行环节
QLExpressRunner如下图所示,从语法树分析、上下文、执行过程三个方面提供二次定制的功能扩展。

首次运算后被即可被缓存

分析出相本中所包含的:

function,委量列表,语法树

结构等等

AST文法匹配

token枥析

token分解

生成指令集合

输入腾本

ApplicationContext

输入上下文

中的springbean

参照:QLExpressContext.jva

解析执行脚

本,返回塔果

是否数字高精腰

自定义function

宏定义

足否还辑短路

nunner

日志级别控制

操作持

自定义method

自定义HeLD

一般为单例模式,一次性初始化

QLExpress脚本引擎详细功能分解


1.获取原始脚本,参数
QLRule中的value可以使用缺省值,对应yaml的key则为缺省值对应的ruleCode
存在默认读取文件路径:com.c2f.boot.starter.rule.engine.QLExpressProperties
String rule为获取的原始脚本,后续基于此构建AST语法树

argNames"joinPointu"

@Around(value-"@annotation(g

(gLRule)

otcggtctpatcotarrmm

M地Od3TGtuRSStotug.t.

方法篷名

METHODMETHODATUREGETMETHODO

method:"oubiComC2Htin

方法

joinpoint.getargsO;

AsDjt12899Rt

objectljargs-joi

NEthod.gEtPAarAmeterAntationsO;PArameterAnototions:Annototion[4te1884

Annotationlutl

parameterAnnotations

别名注解

Btyeoatgbdto.tlau..

ugetParameterName(m)

stringl

method:"pubticcom.

PARAMNAMES

规则code,QQLRule注解声明式腿值的

StringruleCode-qlRulevalue

qLRUL"CMR

if

(stringutils.isEmpty(ulcode)

method.getDecLaringcLassO.getName

method.getam;省值方法全路径,方法名

rulecode

规则脾本,默认:resourcerrr*yaml

STingFuLERULECONTEXTGETRULEByCODEULCODE);

if(Stringutils.iEmpty()

thownewC2fOLExPressExcePtiONC"对应规则不存在,LeCode"

ruleCode)

]

/构建表达式运行参数

buiLdContextargsarmnnoationamame

QLExPressContextcontextbui


2.构建后续赋值上下文
没取别名,默认构建一组:形参:value
取别名,另构建一组:别名:value(后续yaml能汉化使用也是基于此)
所以默认构建的上下文数量 = 形参个数 * 1,有别名 = 形参个数 * 2

ROADERMODE

buildcontext(objectotio

args:object[41@28999

parameterAnnotations,stringl

PRivatEQLExpressContext

parameterAi

paramNames

QLExPrEssConteXtSPPLICtOCOTXTEXT

QLEXPRESSConTExtcontext

"orgspringframeworkWco

neW

IT(lArrayutilsiEmpty(ParamNames)

paramNames.Length;1++i:1

FOR(iINTiB;1

stringparamName

paramNames[il;:

PUrtNOmPOUTVRLActtct

objectarg-args[il;

ANNOTAtIoNPARAmeTRANNOTATIoNParAmeTrAnnOTatIONS[I;

stringllaliasarr-nulu;

forAnnotationannotationaamenotation)

if(annotation.anotationtypeqLAiias.cass

aliasarr-(CQLAZias)(annotation)).value;

ifCArrayutils.isEmptyCaliasarr))

QLALIASANNOTATIONARECLASSOAOTATIONCOLALIACLASS

(CannotationFnulu)t

if(

aliasarrannotation.valu;

context

中名之

context.put(paramName,ag

oContextQLExpressContext@21058)ize

iF(Arrayutils.isEmptyCalias))

pecttetoooe

FoR(Stringalias:aliasr)

"行计划ooideea

context.put(aliasarg)


3.调用执行

objectresult;

QLRul注解支持的医退护营,款认-

tryt

iF(qLRule.timeoutiiuis>0)

IsTceFALseqLULeimoutMii)

Pesult-expressRumerxcuteuLe

eLset

"@com.c2f.boot.starter.culeenge

isTrace:talse)i

PesultXpessRumer.xecuteuee

QLRuLe:"OcO

catch(ExcEptione)t

C2FQLEXPRESSExCEPTIONC"表达式执行异常ULCODE"+ULCODE

thrownew

CLASSIRETURNTYpemethoD.gETReTurnTYPO;

HAwmm

thrommeCrLapressekeepton达式的返国关与方法返回关不代.LeO"+)

returnresult;


延迟执行

执行一段文本

Params:expressstring-程序文本

context执行上下文

errorList输出的错误信息LiST

isCache-是否使用Cache中的指令集

isTrace-是否输出详细的执行指令信息

timeoutMillis超时毫秒时间

Returns:

THrows:Exception

publicDbjectxcuteStringexpessstringecntext,

context,

Liststringerrorlistbooncaceoce

timeoutMillis)throwsException

/设置超时毫秒时间

QLExpresstimerstimetioMili

tryt

returnlthis.execute(expressstring,contexti

aLog:nulD):

isCache

isTrace

即非延迟执行

HfinalLyf

QLExpressTimer.resetO:


默认第一次执行即缓存

原生属本字持串

组装的上下文

PuticbjectxcUtEStrngeessStn9c

expressstring:"impocom.c

ListstringeoList

isTrace:fals

isCache:true

errorlist:nulz

throwsExceptiont

InstructionSetparseResultnulu;

parseResult:nulz

if(isCache-truefis

isCache:true

parseResuLtexpressInstructioneCache.getexpressstring);

默认第一次执行即镇荐

IFCPARsERESULTNULL)

e)t

synchronizedCexpressInstrctioncc)

DettesmltB@emnct.

if(parseResultnulu)t

梅建AST语法树

parseResuLtthisparseInstructione(expressstring);

expressstring:"importcomca

expressInstructionsetcache.put(expressstring,

parseResult):

FeLSet

parseResuLtthis.parseInstructioneexpressstring)

tURNeXECUtEReentRAnTLARSERSULTe


构建AST语法树
基于:com.ql.util.express.parse.KeyWordDefine4Java 构建
选择匹配工厂

pubticbooteanceateInstructionInructi

result:"1n"

StAKFORRLERKCONTLNUOSTKAL

forStack:

size

booLeanisRooT)throwExceptionRootte

NStUCtLOMFAtOYAtYS

getInstructionFactoryodec

NODE:"STATBLOCK:STA

Complesthisesut

booLeanHasLocaLVarACTorYCEATInsTructONCaComie

Shu.meemeittudh.

returnhasLocalVar

boolea

MAven:COM.ALibaba:QLExpress:3.2

(QLEXE

BLOCKINSTUCTIFCToCOmMqLXI)

获取一个表达式需要的外部变量名称列表

Maven:com.auibaba:QLExpress:3.2.6LEx

BreakInstructionfactoromqt

CaLtFUnctionInstructionactooq

Params:express-

MAvEN:cOMALibabA:QLExpress3.2.6Ex

Returns:

MAven:coMAuibaba:QLExpress:3.2.6Ex

CastInstructionactorq

THrows:Exception

Maven:coMauibabaQLExpress3.2.6x

ConstDataInstructioco

publicstringlgetoutvarNames(S

Maven:com.auibaba.QLExpress:3.2.6LEx

ContinueInstructionfactomq

MAveEncoMAuibaba:QLExpress3.2.6x

returnthis.parseinstruction

DefIneInstructionactomqt

Maven:com.auibaba:QLExpress:3.2.6LEx

FIeLDCALLINTrUctIOFACTorYOMqLLXutO)

Maven:com.auibaba:QLExpress:3.2.6Lx

ForInstructionfactorm

Maven:com.auibaba:QLExpress:3.2.6QLEx

FUnctionINstructionFactoom

publicstringu

getoutFunctionNa

MAvEncOMAuibaba:QLExpress:3.2.6Ex

IfInstructionfactorycomqt

createlnstructionSetPrivateo

ExpressRunner

Maven:comauibaba:QLExpress:3.2.6x

InInstructionfactoromq

MedicationwithdrawalSericeTetslidtwha

MavencoMauibaba:QLExpress3.2.6

KeYVaLUeInstructionFactoyom

Console

ger

Maven:com.auibaba:QLExpress:3.2.6Ex

LamdaInstructionfactoromq

LoADAttrINstrUctionFAcTorYOMqLtXPEuctON)

Maven:coMauibaba:QLExpress:3.2.6LEx

Varables

ti.n.oot.mo.fomoc

thisExpressRunner@fou

1o22rm*

View

resultinstructionset@21274)

elnstructionSetpriva


递归解析
分解为Word[]:"sum",”=“,”0“,”;“,"for","(","i",......
Word[]转化为List《ExpressNode》:每一个word变得有意义:常量、变量、符号、分割符号

pubiicclassBLockInstructionFactoryex

extendsInstructionFactoryt

ACompiLeExpressRunner@16922

PUCBSU

result:"Ln"

node,booleanisRoot)

STACKFOrRELBREAKConTInUeForSTackEXpresNodenod

isRoot:tr

forstack:size8

NODE:"STATBLOCK:STATBLOCK

throwsExceptionf

iF(node.isTypeEquaLsorchia"TOLO

srtut.ttommtomtomm

false

ResULt.INStPUctIONCNWINSTRUTICLEDaTaSTACkO.seLInNODEetLINE);

int

tmpPoint:o

ttmpPointresult.getcurrentPoint+

booLeanreturnvalfalsereturnVa:faLse

BOOLEANHAsDEFfaLsEHaffaLse

FOR(ExPRESSNODETmPNODENODEGETCHILdRENO)

TpNODE"STATSEMICOLONSTATSEICOLON

INoDE:"STATBLOCK:STATBLOCK

QCompiLExpressRunner@16822

acompite.atenstuct

result:

booleantmpHasacom

HasDefFHasDeffalse

tmpHas

进归将父节点下面的全部解析

A

if

(HASDEfTU&isRoot

SFALSE

SNODEgETTREETYPEO.EqUALSOCHLPRT"STAT.BLOCK)

esult.nsetnstuctto

omt.mertmw.tm

returnvaLFalse;

FeLSet


解析第一行:请领状态 = 药品请领单.执行状态

PWLCBOLCREtEnStUCtEPe

LZ:执行状态OPNUMBCR

m.....mmu.od

PResHoD

booLeanreturnvalfalsereturnVal:faZse

XPRESSMDDChIN

//处理对象

tmpHas:faLse

acompizeExpressRunner@16922

B9dLcontphes-Btompite.etnct

returnvalreturnvalltmpHas;tmpHas:faLse

/处理属性名称

IFCHTAREntU9

thrownewqLCompiteExceptionC对象名称不是字"chiten)

CHiZdEEXpressNode[21@21662

StrIngFieLdMameStringch

fieLOName:"执行状态"

OPEAtorBaseOpnewOperaTorFieLdCFieLdName);

Op:"FieLdCalZ:执行状态"

intnewInstructiongperatorconaomatNmhi

resuit:Wn1.Lnndatt

result.addInstruction

resuk

ReturnreturnVaLfalse

returnVal:

false

中名力

REUUIMS

View

type-"man

name二null

gLOBENAMEEnULL

torycreatelnstruction0

ldCalllnstructionFactory)

instructionListlnstruction[31@21689)

MedicationwithdrawalServiceTests.alidateWthdrawal

0-lnstructionLoadAttr@21694)Loat请领状态"

SNSOe三盛日美

YCONSOle

er

1lnstuctionLoadAtt@21695)Loadtt:药请领单

2-lnstructionoperator@21696P:FedCl执行状态OPNUMBER

Variables

operator-Operatorrleid@zi6/9Fleidcal枫行状态

三this-FieLdCallnstructionFactory@21650)

OPDatanumber-1

'A:comnil-/EworoscDrnnem160221


解析第二行:执行计划状态 = 执行计划.当前执行状态,clearDataStack后续也会当做一个指令使用

QLEXPRESS-3.2.6a

FIOLdCaLLInstructionFactorY

createlnstruction

Glu

MedicntonWithdriwniSenyioeTestvalldatewthdraw

pafold

DOCTOrORdEREXECUTIEPLEnDTOD

MedicotionwithdrawaServioeimpljava

MedicattonwthdrawalRuleyaml

IExPRessSeniceJava

IExPRESSSeNVICAMELJONA

om

OperatorinstructionFactoryJva

lninstructionFactoryJava

InstructionFactory-Java

ExprssRunner.ava

OLExPRESSTLMeRUaVE

BlocknstructionFactory-Java

ExpressParsejava

lrstructionSetRunnerJava

ThreadLoaalava

OPORSTEDOLECBChOMAans9crJaVa

lmtructionSo.aVa

订W099We97e

wDatabase

名月AR6136

PUBLicBOoLEANCREATEINSc(ExPressRuneraCompiLe

aCompiLExpressRunner016822

o.o

EXPREsSNODENODEBOOLEANSROOT)thOWSEXcEPTiON

NODE:FIELDCALL

isRoot:false

HStrUature

booLeaneTurnvaLfaLsea

ExpressNode[]childrennode.gechidre

EXPREssNodE[21@21836

chiLdren:

事处理对象

b.otntDplasacopie.t

tmpHas:false

QCOmpiLeExpressRunner@16822

returnvalreturnvalltmpHas;tmpHas:faLse

/处理属性名称

IHtdRentu.t

throunetQLcompiteException对名称不是字串常:"+chitdren(1])

食围洲洲

CHiLdn:ExpressNode[21@21836

StringHieLdMeStringchno

fieLOName:"当前执行状态"

peratorBaseophewDperatoFieLdLdNm;da.

33

地,.m

34

returnVal:false

returnreturnvalafalse

resun

母福方罗

instructionListlnstructionl8]@21859)

OLNSTUCInLodt@1694)DA请领态

1LNSTTIOnLOAdAr@21695)LDAtu:药品请领单

FeLdCalllnstructionfactorycreatelnstructiong

2-nstructionoprato@21696PFiedc行状态OPNUMBERL

Debug:

MedicationWithdrawalericeTestsidtwtrw

3-instructionoperator@21860)"P0

OPNUMBERL2)

三4:lnstUcLionCLarDatastack@21861"clearDatastack

面回

Console

三5

"LoadAttr执行计划状态"

五stuctionLondAttr@218621"L

Variablas

SEIUOAE

6-LnstructionLoadAt@1863)Loadtt:行计划"

EthisfFieLdCalinstuctionfactory@21650)

7+Nstuconoperto2184PFld当前执行状态OPNUMBER

QACompileExpressRunnerQ160221

TUNctionDetineHashMape21690)SIze-0

createlnstnuction:34Flel

执行计划状态n7LoadAttiView

resulnstructonst@2127态

cachefunctionSetnull

OProblems

QFINDRUNHETODO

.Terminal

PGit

FPMD-IDEASBUNU

CEventLo9

@Profler

TsOSpringPMD

WEndpoints

Debug

foature_mormaldow2021090315065

34/uptdate35:6LFUTF-84spac0s

AutofotchiFnishod(10minutesago)


解析第三行,不再是loadAttr而是LoadData
或需是引包则loadData,变量定义是LoadAttr,未研究

QLEXPRCSS-3.2.6AR

FIeLdCalLnstructionFactory

creueInstuction

Glt:

instruction

MedicationWithdravalSeryioeTestvalidtewthaw

pafold

MedicotlonwithdrawalServioelmpLVa

DOcTorORdErEXECuTIvEPInDTODass

MedcatonwthdrawaiRule,yaml

lExpressSeniceJava

IEXPRESSSENVICEMFLJOVA

OperstorlnstructionFactoryJVa

lrinstructionFactoryJava

LMstructionFactory-Java

ExpressRunner.java

BlocknstructionFactory-java

QLExPressTimer.lava

ExpressParye.java

FIEIDCalinstructionFactoryjava

OPERAteDAtaCacheManaoorJava

ImstructionSetRunner.iava

ThreadLocaLiava

lmstructionSet.java

WDatabase

订W白UJE7

ULIBOLREtS

9R月61136贸

Fesutt:":t:领态LODA:药领单

InstrctionsetresuL

EXpressNodenode

result

structure

BOOLEANRETURNVaLFa

ExPressNodelJchidre

u山市心324地比

1处理对象

typesman

aCompile:

SiZe二8

booLeantmpHasaComp

name二null

returnval-returnval

gLobeName-null

instructionListilnstruction[13]@22039)

/处理属性名称

ONScInLOadA@21694)LaDA:请领状态

iFCchildren[ilgtode

NTcTiOnLOadA@21695)LdA药领单

2-lnstructionoperator@21696Fied行状态OPNUMBER

thrownewQLCompil

3-Lnstuctionoperator@21860)"OP.OPNUMBER[2]

4+lnstuctionclearDatastack@21861)ckearDatastack

食锡别多粉兴粉河方易

5StuctinLoadAt@2186Loadt行计划状态"

STringFiELONAME

(St

6nstuctonLadA@21863)"LdAt执行计划

7-instuctionopeato218:Fld当执行状态OPNUMBERL

8-instructionoperator@22040)*OP.OPNUMBER[2?

OperaTorBASeOpnew

9-instuctionclearDatastack@22041)clearDatastack"

"FIELD-CALL

三10二

10-instructionLoadAtt@22042)"LoadAtt.已作废状态"

result.addInstruction

三11

H:thoconcomom

returnreturnValfalse

三12

12-nstuctionoperto220CM

INctoNDeIine二H+shMap@21690Size0

cacHEFUNcTIiONSeTEnul

ExPOrtVaRAARRayList@1691)Sze

Fleldcallinstructionfactorycreatelnstructiong

Debug:

MedcationWithdrawalserviceTests.alid

个艺面国

COnsoke

S0祥0A

EthisfFieldCalllnstructionfactory@21650]

QAComplleExpressRunner@16022]

createlnstnuction:34,Flel

地都地描他地

MPMDIDEABUIUWENDPOINTSUSPRINGPMD

牛EwEnTLOG

OProblems

QFINDRUNHTODO

PTerminalGProfiler

PGit

Debug

34/UPtoDae34:1LFUTF84PacesP

Autofotch:fnished(12minutesago)

foaturo_mormaLdav20210909150651


真正执行

Q

QLExpres5-3.2.6-sourcesacom

Gu:

?

GExPRESSRUnNER

MedcationWithdrawalSeryioeTestvelldatewthdraw

L

express

m

paod

MEdIcattonWIthdrawalSerioelmpLaVe

QLRUEFAVA

IExpRessServiceJa

QLRULEASPECLJVA

IExpressservicemelJanva

MedicatLonWithdrawaiRuleyaml

Mav

GOPERATORIRSTRUCTIONFACTORYJVa

lnnstructionfactoryjava

BlocknstructionFactory-Java

ExpressRunner-Jjava

QLExPreSsTin

FIeLdCaLIInstructionFactoryjava

lmtructionFuctory-Jjava

ExpressParsejava

OperateDataCacheManagerjava

LMStuctionSotRunnarFava

ThReDLoCaLaVE

lmstructionSet.java

1WO0

REDDERMODE

624

textsets:"[h:LoadAttr:请2Lod.tt

PrivateOBjEctexecuTEREEntran(Inst

nt(Instructionetsetxrescontextstrnge

ST:NUiSTcEFaLseaLognu

625

tistsstringrrotist

626

try(

627

reentrantCount:1

IntreentrantCountthreadReentrantcount.ge

628

:thERntRAnCOUnTHU

thrEADREentrantcount.set(reentrantcount);

629

Urnreentrantcount1?reentrantcount:1

630

return

H/线程重入

631

InstructtonsetRumer.executeehs

632

sROUmLAaDAtrUL

633

aLog:nulL

isTraceisCatchExccption

nfalse

setsthisoaderacontexterrorlist

ner:this,se

634

InstructionSeTRunner.executeouter(ner

Sets::LOdAtt:请领状态2LOADAtt药请领单

635

IisCatchExCeptioTALEm

istrace

finalty

636

thrEADREENTRAnTCounTSE(THRREntAnTCunT.gETO;

637

638

ExpressRunner

oxeCuTEREEntrantO

Debug

MedicationWithdrawalServiceTestslitr

FCONSOle三

Console

thisExpressRunner@160221

AST诗池制

地地地地地地地心地

exeateReentrant:634,E

AContextQLExpressContext@21058)Size

三"退药记录"(ArrayList@22086]

上下文业考数赛

6]size30

I

execute:589ExpressRu

"订单>radeorderDtoQ22088)"Tradeor

飞中址中m中

TULCExCCUTC:65QLRULCA

一兴:地otu聊地地也m也

invokeO:-1.NativeMethox

杯心田一都服一

invoke:62.NativeMethod

人人人A

W00

"medicationwhdawalRecordi

LMVOKE43DELcgatingMe

龙地一也地

S010O个品卡

invoke:498.Methodlav

地地都一一他以

invakeAdviceMethodWal

地地地你地一吧

inyokcAdwyiceMethod:63

PerrorListanull

invoke70,AspectJAroun

ioTmoxn-fnlca

YGIQFNDRUNATODO

WENdpaints

OEVENTLOY

SpringPMD

1PMD-IDEA

GProfler

Bulld

OProblems

foature_mormaldev20210909150651

Autofetch:Finished(14minutesa9o

3NLtO-D634:1LFUTF-84spac0s


基于不同指令进入不同的重写方法

Q

QLExPReSS-3.2.6a

lnstructionSetexecutennerOniginstruction

Gn:

MEdcationWitharaISEriceTESldteWhrawal

utdil

com

OparateDotacacheImpl-ava

OpersteDotaCochelmel4Orig.Ja

peold

OPERSTEDATCAcHeMAnNgErJavax

BlocknstructhonFactory.@ava

IRSTUcTIonStRUnnen.Aara

EXPReSSRunner.WNa

lMstructonSet.JaVa

lnstructIonGoTo-Java

INSTrUctIOnREtURnjava

lnstructionLoadLambda.java

InstuctionNewwirClassjava

lrstructiondperator.java

lnstuctionLoadAtnLava

INStrucTIonGoTOWRhCoNdILioNJava

GLMSTRUCTIONCALISEIIDEFNEFUNCTONAVA

lmstructionclearDatastackava

lnstuctioncalMacro.java

lNstrucTionCIosoNawiArea.Java

GatRuteutdrtm

207

3uWooo

PEDDERMODE

208

returnresult;

289

210

errorlist:nuiz

aLog:nuii

poteycgpeouomtoromttoomm.

WEN14

NULLInstruci态

211

Instructioninstruction-nulu;ins

212

tryt

213

whie(environmen.programPointth.h)

QLEXPREssTimerssrTimeutO;

214

htuct0mthhtutm

215

216

instruction.setLog(alog);/设置L0G

ogaLog:nulZ

instruction:

PFIELDCOLL:行状态OPNUNBERIeRRLSTULZ

217

environmen.RunEnvironmer

instruction.execute(environmen,errorlist)

218

ChooseImplementationofInstnucinexcutnnrmni

219

catch(Exceptionef

cro(com.ql.utiz.expressistruction.detai)

Maven:comlbaba:QLExpress:3.2.6@LExpress-3

InstructioncaliMacro(c

if(printInstructionerror)

220

Maven:comalibaba:qLExpress:3.2.6@LExpress-

InstructioncaLtSeLfofIneFunctionnt

Log.error(:"当前Prograr

221

Maven:conauibaba:qLExpress:3.2.6LExpress

InstructionearDatastackomqt

222

当前指令

Log.error(o

Maven:comauibaba:QLExpress:3.2.6Lxpres

INStrUctionLosNeWAreaomqt

223

Log.errore);

Maven:com.aubaba:QLExpress:3.2.6@LExpress-

Instructionconstpata(omqLti

224

Haven:coMaLibabaQLExpres32x

INstructionGofo(com.qLutiexpeudea)

225

throwei

Haven:coMauibabaqLExpre32x

Instructionorouithcondtionq

226

Haven:comaLibabaQLExpres32xe

InstructionorouthNothi

227

INSUctionLOADAttomqL

Mavencom.alibaba.QLExpress:3.2.6

6(QLExPress3

ntgetinstructionLengthotreI

HAven:coMALbabaQLExpre3.2x

228

publicintg

InstructionL.oadLamdaomqt

Maven:com.auibaba:qLExpress:3.2.6LExpress-3

InstuctionNewvrclas

231

pubuicvoidadDMacrodefine(Stringac

MavencomauibabaQLExpres3.2x

INstUctionpenNeWAreaomqLixr

lnstructionsetexecutelnnerongilnstnuction0

Haven:comauibabaqLExpre3.2x

InstructionDperator(comqLutixend)

Debug

AedcationwithdrawalServiceTests.alidateWithdrw

INStructionReTurN(COm.qL.UtIZexPRESSITRUTIONDETAIL)

MavencomaLibaba:QLExpress3.2.6xre

Debugger

Console

Variables

地地们一地地心地.)

G

SOWUONE

environmen-RunEnvironment@22156]

exeautelnnerOnigilnstruc

errorlListenul

excute:185.lnstuctionS

aLogEnuli

execute:64.Lstructions

dnstnchinnonnto216963OPFildel行状奋OPNUIMBFB

GIQFINDRUNETODO

OProblems

EvEntLog

PROFNeIIPMD-IDEABULdXENDDANtSUSpingPMD

PTerminal

口Autofetch:fFinishod(6mlnutesago)

FeAturemormaLdev20210909150651

3ALP-to-dat217:33LFUTF-84


清除栈内数据

publicCLassIstuctiatatckextndsstructin

privatestaticfinallongse

serialVersionD6286430548739444891L;

pubtiovotdxeuteRnvrmt

enviro

1/目前的模式,不需要执行任何操作

IfCenvironment.isTraceog.gnb

Log.debug(o:this);

environment.cLearDatastackO);

environment.programPointaddone

environment:RunEnvironment@22156


执行完毕返回

DECREmtmtTUOtAt

try

IF(GLRULETiMEOUTMiLLis0

ewt.ogrttmo

LSet

mt.@utmttomdm.m..

CaTCH(EXCEPTioNe

throuneuCToLExpressExcepttonC装达式执行异LCOd+LeCOd

0:pobod:ploteo.c.ho.....tum

CLASSIRETURNTYPEMETHOD.GETRETUrNTYPeO;

心0

;ruLeCode"medicationWithdrawaLRuLe"

thrnCT0LPeCePtomC达回号方法返回关不)

Peuit:HdGotGmtrotm.troalmm-

Returnresult;resutt:



相关文章
|
5月前
|
人工智能 JSON Java
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
AI时代下,规则引擎的需求反而更旺盛。QLExpress4 通过全面重构,在性能、可观测性和AI友好性上大幅提升。
1702 15
AI时代,我们为何重写规则引擎?—— QLExpress4 重构之路
|
4月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过YAML配置表达式规则。支持AST语法树解析、上下文构建与动态执行,提供脚本缓存、别名映射、指令重写等扩展能力,适用于灵活的业务逻辑解耦与动态化控制。
|
4月前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑解耦。基于AST语法树解析,提供上下文绑定、动态脚本执行与缓存机制,适用于复杂条件判断与计算场景,如BMI计算、用户规则校验等,具备高扩展性与易维护性。
|
4月前
|
缓存 Java 开发工具
QLExpress使用及源码分析
QLExpress是阿里巴巴开源的轻量级规则引擎,支持通过YAML配置规则脚本,结合注解实现Java方法与表达式映射。通过别名机制、AST解析和上下文赋值,实现灵活的动态逻辑执行,适用于复杂业务规则场景。
124 0
|
4月前
|
缓存
QLExpress使用及源码分析
本示例演示QLExpress规则引擎的完整使用流程:从实体构建、接口定义到脚本编写,表达式内容由yaml文件(如user.yaml)维护。运行时通过QLExpressRunner解析语法树,支持上下文定制与二次扩展。自动扫描规则脚本,构建AST并执行,支持别名映射与汉化,实现灵活的规则计算与管理。(238字)
150 0
|
3月前
|
关系型数据库 MySQL 数据安全/隐私保护
MySQL Docker 容器化部署全指南
本文为MySQL Docker单实例生产部署规范v1.0,涵盖镜像拉取、4种部署方案(测试/单机/企业入门)、结果验证与5类常见问题解决,集成备份恢复、安全基线及HA选型建议,适配SaaS初创、中小企及私有化场景,强调数据持久化、资源限制与内网安全访问,不适用于金融级高可用场景。
384 3
|
7月前
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
2467 77

热门文章

最新文章