• Nenhum resultado encontrado

Regras de Negócio. Toda empresa possui uma série de processos de

N/A
N/A
Protected

Academic year: 2021

Share "Regras de Negócio. Toda empresa possui uma série de processos de"

Copied!
9
0
0

Texto

(1)

jboss drool_

!"#$%&'!&(!")*+,&-,'!.&%!#&./+0,&

*,.-1!2$%3&!45,15!4',&6/2,%&'!&'!*+%7!%&

'!&58#+,%&495!+%&,&:/!&0,#4$&'+;9*+1&$&%/$&*#+$-ção, manutenção e execução. Este artigo mostra

como utilizar o JBoss Drools como um Sistema para

Gerenciamen-0,&'!& !"#$%&'!&(!")*+,&<,/&=/%+4!%%& /1!&>$4$"!.!40&?@%0!.3&

%+"1$&= >?&!.&+4"1A%BC

T

oda empresa possui uma série de processos de

negócio. Estes podem ser considerados como sendo o conjunto de todas as atividades desempe-nhadas pela empresa. Cada processo de negócio visa !"#$% &'()*+",*#"$-$!.&*/"*")$.(#'(!$0'*")$"!(#1 keting visa aumentar o interesse dos consumidores pelo produto da empresa. Para chegar a este resul-'()*"! 2'(%")$32%4$%".#$32%(!"%$#"'*!()(%/"(%"5 (2%" )$.$0)$!")$"206*#!(74$%")$")26$#$0'$%"6*0'$%8")(-)*%")$"3&2$0'$%/"6*#0$3$)*#$%/" % 9#2*%"$'3+":%"#$;#(%" de negócio são os requisitos fundamentais para que

*".#*3$%%*")$"0$;<32*"('20=("("% (">0(&2)()$"$%.$3?->3(" #$% &'(0)*" 0*" @(&*#" $%.$#()*+" A0'#$'(0'*/" !(" #$;#(")$"0$;<32*"0$!"%$!.#$"B"3&(#(+":&B!")2%%*/"B" ! 2'*" .#*@9@$&" 5 $" $&(" ! )$" C(%'(0'$" $05 (0'*" *" .#*3$%%*" )$" 0$;<32*" 6*#" %$0)*" #$>0()*+" ,*#" 3( %(" destas características, desenvolver regras de negócio usando uma linguagem de programação tradicio-0(&"D3*!*"E(@(F".*)$"(3(##$'(#"0*"6 ' #*" !"3<)2;*" ! 2'*")26?32&")$"%$"!(0'$#"D2!(;20$" !"!*0'$")$")$-3&(#(74$%"261$&%$"$%.(&G()*%".$&*"3<)2;*F+ :&B!")2%%*/"(".$%%*("5 $".*%%

2";#(0)$"3*0G$-A-'$#0(&2H(0)*

Regras de

Negócio

3*!"EI*%%"Drools

Utilizando a plataforma

da JBOSS DROOLS como

ambiente para gerenciamento

de regras de negócio.

(2)

!"#$%&'()%*+!,-./0+%"1%2+!)-,1%3%1!"#-4'.)5+!)-,16718++9,+:9;# D,#.$',&!.&E+A4*+$%&'$&E,.-/0$FG,&-!1$&H4+5!#%+'$'!&D!'!#$1&'!&?G,&E$#1,%C&I#$J$1K$&4$&!.-#!%$&L$1/!0!$.M(II&N$0$C&E,.&

mais de 10 anos de experiência, já trabalhou em empresas de diversos setores como: Telecom, Bancos e Indústria utilizando Java, OPO&!&EC&O,%%/+&$%&*!#0+Q*$F7!%&?ERO3&?ESEN3&?E=EN&!&?ETU&<VBC

cimento destas regras, muitas vezes conhecida como (0(&2%'(")$"0$;<32*/"0$!"%$!.#$".*%% 2" !("$-.$#-'2%$"'B3023("3(.(H")$"( -2&2(#"*")$%$0@*&@$)*#"("!*-delar completa e corretamente as entidades do do-!?02*")*"0$;*32*+"J%%*"(3(C("6(H$0)*"3*!"5 $/"'*)(" vez que uma regra de negócio for mudada, o departa-!$0'*")$"KJ"'$0G("5 $"%$#"$0@*&@2)*".(#("(&'$#(#"0*-vamente o código da aplicação, passar pelos testes, deploys nos servidores etc., ou seja, todo o trabalho )$"!(0 '$07L*")*"%2%'$!(">3("0(%"!L*%")$"KJ")2!2-0 2'$07L*")*"%2%'$!(">3("0(%"!L*%")$"KJ")2!2-0)*"("M$-2C2&2)()$"$"(;2&2)()$")*".#*3$%%*+

:%" %2' (74$%" )$!*0%'#()(%" (32!(" % ;$#$!" *" uso de um Sistema de Gerenciamento de Regras de N$;<32*+" O!" I %20$%%" P &$" Q(0(;$!$0'" RS%'$!" D%2;&(" IPQR" $!" 20;&T%F" .$#!2'$" 5 $" *%" .#*3$%%*%" *#;(02H(32*0(2%" U" $" (%" )$32%4$%" (%%*32()(%" (" $%%$%" .#*3$%%*%"U".*%%(!"%$#"!*)$&()*%/"2!.&$!$0'()*%/" monitorados e mantidos separadamente. Esses sis-'$!(%".*%% $!"6$##(!$0'(%"5 $"( -2&2(!"("3#2(7L*" )$%'(%" #$;#(%" '2&2H(0)*" !(" &20; (;$!" $%.$3?>3(" )*")*!?02*")*"0$;<32*/" !("VRW"DV*!(201%.$32>3" Language). Desta forma os especialistas de negócio .*)$!" )$>02#" $" !(0'$#" (%" )$32%4$%" 5 $" ; 2(!" *" comportamento dos sistemas, reduzindo o tempo e *"$%6*#7*"0$3$%%9#2*".(#("5 $"$%'(%"! )(07(%"%$=(!" realizadas. Como as regras são mantidas separada-!$0'$"(*"3<)2;*")("(.&23(7L*".$&*"IPQR"(%"! )(0-ças efetuadas podem ser aplicadas rapidamente em produção sem a necessidade de recompilar e rede-.&*S(#"*"3<)2;*")("(.&23(7L*+":&B!")2%%*/"*"!$%!*" conjunto de regras pode ser aproveitado sendo em-C '2)*"$!"(.&23(74$%"=9"$-2%'$0'$%+"

Diferenças entre Linguagens

Imperativas x Linguagens Declarativas

W20; (;$0%"2!.$#('2@(%"D(%"5 (2%"%$; $!"*".(-radigma de programação imperativa ou procedural) %L*" *#2$0'()(%" (" (74$%+" N$%'$" 3(%*" !" .#*;#(!(" 0()("!(2%"B")*"5 $" !("%$5 T032(")$"20%'# 74$%"5 $" !(02. &(!"@(&*#$%")$"@(#29@$2%"D&$2' #("$"$%3#2'(")$" @(&*#$%F+" X%" #$% &'()*%" )(%" *.$#(74$%" $-$3 '()*%" na CPU são gravados na memória. Seus conceitos .#2032.(2%" %L*8" @(#29@$2%/" #$.#$%$0'(!" !(" .*%27L*" de memória; atribuição, que representa a escrita de !"@(&*#"$!" !("@(#29@$&Y"$"&**.%")$"#$.$'27L*/"5 $"

.$#!2'$!"5 $" !("20%'# 7L*"%$=("$-$3 '()("!(2%")$" !(" @$H+" X.$#(74$%" %*C#$" $-.#$%%4$%" %L*" $0@2()*%" da memória para a CPU, e o resultado da avaliação )$%%(%" $-.#$%%4$%" B" '#(0%6$#2)*" )(" Z,O" .(#(" (" !$-!<#2(/"#$.#$%$0'()(".$&(%"@(#29@$2%")*"&()*"$%5 $#-)*" )$" !(" )$3&(#(7L*" )$" ('#2C 27L*+" A-$!.&*%" )$" &20; (;$0%"2!.$#('2@(%8"[XPKP:N/"I:RJZ/"ZXIXW/" Pascal, Java, C e Python.

W20; (;$0%")$".#*;#(!(7L*"&<;23(%"D* ")$3&(#(-'2@(%F" %(!"0*'(74$%"6*#!(2%"&<;23(%".(#("("$%.$32->3(7L*")$".#*3$%%*%"3*!. '(32*0(2%+"O!".#*;#(!(" B" C(%$()*" $!" 6('*%/" 5 $" .*)$!" %$#" #$&(74$%" D(%%*-32(74$%F" $0'#$" 3*2%(%/" $" #$;#(%/" 5 $" .#*) H$!" 6('*%" deduzidos a partir de outros. Fatos conhecidos a res-peito de um determinado problema devem ser reuni-dos; regras devem ser criadas para que seja possível )$#2@(#"0*@*%"6('*%+"V$0'#$"*%"$-$!.&*%")$"&20; (-;$0%"20'$#('2@(%"'$!*%8",PXWX\/"WJR,/"R]W"$"^RWK+

Uma linguagem declarativa utiliza uma ou mais 3*0)274$%".(#("206$#2#" !("3*0%$5 T032(/"$&(")2H"_*" 5 $`"D#$;#(")$"0$;<32*F")$@$"%$#"6$2'*/" !("&20; (- ;$!"2!.$#('2@(")2H"$-('(!$0'$"_3*!*`")$@$"%$#"6$2-'*"D(&;*#2'!*F+

Uma instrução em uma linguagem imperativa %$#2("(&;*"3*!*8"@9"&9"6*#("$"@$#2>5 $"%$"$%'9"3G*@$0-)*+"R$"$%'2@$#"3G*@$0)*/"@9"('B"*"(#!9#2*"$".$; $" !" ; (#)(13G @(+" N$%'$" 3(%*" $ " $%'* " $%.$32>3(0)*" *" 5 $"D$"3*!*F"$ ")$@*".#*3$)$#"5 (0)*"("#$;#("_$%'(#" 3G*@$0)*`"(3*0'$3$#+

Uma instrução em uma linguagem declarativa seria algo como: se estiver chovendo, então você precisa de um guarda-chuva. Neste caso eu tenho a #$;#("_$%'(#" 3G*@$0)*`" $" %$2"_*" 5 $`" )$@$" %$#" 6$2'*/" 5 $"B"_.#$32%(#")$" !"; (#)(13G @(`/"$0'#$'(0'*"$ " 0L*" '$0G*" $-.&23()*"_3*!*`" $ " 2#$2" 3*0%$; 2#" $%'$" guarda-chuva.

<:1%.!=#+"'/0+%>%?41=15+#:1%@ABCC%

Drools

:".(#'2#")("@$#%L*"a"("EIXRR"20'#*) H2 "("VPX-XWR"U"I %20$%%"W*;23"J0'$;#('2*0",&('6*#!"DIWJ,F"(" qual provê uma plataforma integrada para o geren-32(!$0'*" )$" P$;#(%/" b*#cM*d" $" ,#*3$%%(!$0'*" )$" Eventos. Esta plataforma possui cinco componentes 5 $" %L*8" V#**&%" \ @0*#/" V#**&%" A-.$#'/" =I,Q/"

(3)

V#*-*&%" [ %2*0" $" V#*V#*-*&%" ,&(0$#+" X" =I,Q" B" !(" % ?'$" )$" I,Q" DI %20$%%" ,#*3$%%" Q(0(;$!$0'F/" *" V#**&%" [ -%2*0" !("6$##(!$0'(")$"ZA,"DZ*!.&$-"A@$0'",#*3$%-sing) e o Drools Planner é utilizado para a resolução )$")2@$#%*%".#*C&$!(%")$"J0'$&2;T032(":#'2>32(&+"A%'$%" componentes não serão abordados neste artigo, para !(2%" )$'(&G$%" 3*0% &'(#" e" )*3 !$0'(7L*" )(" EIXRR" D@$#" #$6$#T032(%F+" N$%'$" (#'2;*" 2#$!*%" 6(&(#" (.$0(%" dos componentes relacionados ao gerenciamento de #$;#(%")$"0$;<32*"5 $"%L*8"V#**&%"A-.$#'"$")*"V#**&%" \ @0*#+"X"V#**&%"A-.$#'"B" !"Q*'*#")$"P$;#(%"DP &$%" Engine em inglês) enquanto o Drools Guvnor é um \$#$032()*#" )$" P$;#(%" )$" N$;<32*" DI %20$%%" P &$%" Q(0;$#"U"IPQ"$!"20;&T%F+":C(2-*"@(!*%")$'(&G(#" !" pouco mais cada um destes componentes.

Drools Expert

X"V#**&%"A-.$#'"B" !"Q*'*#")$"P$;#(%"* "Q*'*#" J06$#$032(&+" O!" Q*'*#" )$" P$;#(%" B" #$%.*0%9@$&" .*#" $-$3 '(#" !("* "!(2%"#$;#(%")$"0$;<32*+"A%'$"3*!-ponente suporta regras, fatos, prioridade entre as #$;#(%/"#$;#(%"203& %2@(%"* "$-3& %2@(%/".#$3*0)274$%" (&B!")$"* '#(%"6 074$%+"R$ "*C=$'2@*"B"206$#2#"3*0)2-74$%"#$% &'(0)*"$!" !("3*03& %L*"("5 (&"%$#9" '2&2-zada pela aplicação que usa as regras para a tomada )$" !(")$32%L*+"] (0)*" !"Q*'*#")$"P$;#(%"$-$3 '(" uma regra para determinados valores e esta regra re-'*#0("@$#)()$")2H1%$"5 $"*3*##$ "_!('3G`".(#("$%'(" regra. Uma regra é formada por uma ou mais condi-74$%+"O!("3*0)27L*"B"6*#!()(".*#" !("@(#29@$&/" !" *.$#()*#"$" !("&2%'(")$"@(&*#$%")$"@(#29@$&+"O!("#$-;#("203& %2@(".*%% 2" !("* "!(2%"3*0)274$%"5 $"%L*" (@(&2()(%"3*!*" !"_:NV`/"* "%$=(/"("#$;#("%$#9"@$#-)()$2#(" (.$0(%" %$" KXV:R" (%" 3*0)274$%" #$'*#0(#$!" @$#)()$2#*+"O!("#$;#("$-3& %2@("B"(@(&2()("3*!*" !" _XP`/"* "%$=(/"("#$;#("%$#9"@$#)()$2#("%$":,AN:R" !(" )(%"3*0)274$%"#$%

&'(#"@$#)()$2#*+"O!("#$;#(")$".#$-condição é avaliada antes das outras regras, ou seja, caso ela retorne falso as outras regras nem serão ava-liadas pelo Motor.

:%"#$;#(%"%L*"(#!(H$0()(%"0("Q$!<#2(")$",#*-) 7L*" D,#*:%"#$;#(%"%L*"(#!(H$0()(%"0("Q$!<#2(")$",#*-) 3'2*0" Q$!*#SF/" $" *%" 6('*%/" 5 $" %L*" *%" objetos/containers que contêm os dados avaliados pelas regras são armazenados em uma Memória de K#(C(&G*"Db*#c20;"Q$!*#SF+"X%"6('*%".*)$!"%$#"(#-!(H$0()*%/" !*)2>3()*%" $" #$!*@2)(%" )(" Q$!<#2(" )$"K#(C(&G*"%$!.#$"5 $"0$3$%%9#2*+"X"V#**&%"2!.&$-!$0'(" !" (&;*#2'!*" 3G(!()*" P$'$XX" 5 $" B" !(" versão otimizada e orientada a objetos do algoritmo P$'$+"A%'$"(&;*#2'!*"B"#$%.*0%9@$&".$&*"_.(''$#0"!(-'3G20;`" )(%" #$;#(%" D!(2%" )$'(&G$%" 0(%" #$6$#T032(%F+" Quando muitas regras retornam verdadeiro para uma !$%!("(%%$#7L*")*"6('*"'$!*%" !"3*0M2'*+":":;$0)(" B"#$%.*0%9@$&".*#";$#$032(#"("*#)$!")$"$-$3 7L*")(%" #$;#(%"$"'(!CB!"#$%*&@$#"*%"3*0M2'*%"('#(@B%")$" !(" $%'#('B;2(" )$>02)(+" R$; $" !" )2(;#(!(" !*%'#(0)*" *%"3*!.*0$0'$%")*"V#**&%"A-.$#'8 A-2%'$!" )*2%" !B'*)*%" .(#(" (" $-$3 7L*" )(%" #$-;#(%8" [*d(#)" ZG(2020;" $" I(3cd(#)" ZG(2020;+" X" %2%-tema que implementa os dois métodos é considerado !" %2%'$!(" G?C#2)*/" 5 $" B" *" 3(%*" )*" V#**&%+" X" !B-'*)*"[*d(#)"ZG(2020;"D>; #("fF"B"*#2$0'()*"(")()*%" e, portanto, reativo. Uma ou mais regras podem ser @$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-3 7L*&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;.$&(&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;:;$0)(&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;* &#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;)2%.(#()(%&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;2!$)2('(!$0'$+&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34;X&#@$#)()$2#(%"(*"!$%!*"'$!.*"$"(;$0)()(%".(#("$-$-34; !B'*)*" I(3cd(#)" ZG(2020;" D>; #(" gF" B" *#2$0'()*" (" !$'(%+" :*" 20@B%" )$" 20232(#" 3*!" *%" 6('*%/" 20232(!*%" 3*!" !("3*03& %L*"("5 (&"*"Q*'*#"'$0'("%('2%6(H$#+"X" Q*'*#"3*0'20 ("$0'L*"C %3(0)*"3*0)274$%"5 $".*%-%(!" %$#" %('2%6$2'(%" D% C!$'(%F+" X" .#*3$%%*" 3*0'20 (" ('B"5 $"("3*0)27L*"20232(&"%$=(".#*@()("$"0L*"$-2%'(!" mais submetas.

D#++4)%E'F!+#

X" V#**&%" \ @0*#" B" !" I %20$%%" P &$"Q(0(;$#"DIPQF+"K#('(1%$")$" !(" (.&23(7L*" d$C" 5 $" *6$#$3$" (*" % 9#2*" !("20'$#6(3$"D\OJF".(#("5 $"#$;#(%")$" negócio possam ser criadas, editadas, processadas, testadas e implantadas em um repositório de regras. Para fa-zer a instalação do Drools Guvnor no K*!3('/"C(2-$"*"(#5 2@*"; @0*#1)2%'#2-C '2*01a+g+h+>0(&+H2."0*"%2'$")*".#*=$-'*" D@$#" #$6$#T032(%F" $" 3*.2$" *" (#5 2@*" ; @0*#1a+g+h+[20(&1'*!3('1i+h+d(#"5 $" >3(")$0'#*")(".(%'("C20(#2$%".(#("(".(%-ta webapps to Tomcat. Espere um pou-3*" .(#(" (" 20%'(&(7L*" >0(&2H(#" $" )$.*2%" (3$%%$"(" #&")*"3*0'$-'*"5 $"@*3T"3*0->; #* " *" )#**&%/" 0*" !$ " 3(%*/" G''.8jj &*3(&G*%'8khlhj)#**&%1; @0*#+

X&G(0)*" *" !$0 " &('$#(&" $%5 $#)*"

Figura 1.&L+%G,&W!#$1&',&>,0,#&'!& !"#$%&X&N#,,1%&T2-!#0C Pattern Matcher Interference Engine Rete00 / Leaps Agenda Production G-:+#7% (rules) Working G-:+#7% (facts)

(4)

(%"%$; 20'$%"*.74$%8

» Browse: permite que seja feita uma busca de regras por status e categoria.

» Knowledge Bases: possui todas as regras or-ganizadas por pacotes.

» QA (Quality Assurance): permite que sejam 3#2()*%"3$09#2*%")$"'$%'$".(#("@(&2)(#"*"6

032*-D+"/#$&YC&>Z0,',&D,[$#'&EK$+4+4"C

namento das regras.

» Package snapshots: 3*0'B!" !"%0(.%G*'"D6*-'*;#(>(F")("$%'# ' #("0(5 $&$"!*!$0'*")*"%$ " #$.*%2'<#2*")$"#$;#(%+"X"V#**&%"0L*"#$!*@$"#$-;#(%/"!(%"@*3T".*)$"_@$#%2*0(#`"("#$;#("3*!*" histórico.

» Administration: apresenta as seguintes

fun-Figura 3.&>Z0,',&=$*\[$#'&EK$+4+4"C Fire Rule Determine possible !"#$%&'%( # )'*+,-&%.#& Select Rule to Fire )'*+,-&% Resolution Strategy exit Rule Base Workign Memory No Rule Found Rule Found /0,&%,1%$2#-,(#3%45% !"# Rule Base Goal Workign Memory

Examine worling memory and goals to see if goals are “known”true in knowledge base

Do goals match? yes Return True no

(return false to recursive procedure) Return

false

For each rule condition, recursively backchain

with condition goal.

Determine next possible !"#$%&'%( #%45%-6#-7,*8% conclusions and goals

Select Rule to Fire )'*+,-&% Resolution Strategy Rule Found exit No Rule Found Fire Rule

Goals found to be true, exist, returning true yes true Recursively back-chain /9-6%-'*3,&,'*%'1%( #3% !"#%,$%9%8'9" All recursion

(5)

74$%8" $)27L*" )$" 3('$;*#2(%" $" %'(' %/" (#5 2-vamento de regras, log de eventos, permis-%2*0(!$0'*" )$" % 9#2*%/" 2!.*#'j$-.*#'" )*" #$.*%2'<#2*")$"#$;#(%"$"3*0>; #(74$%";$#(2%")*" repositório de regras.

Figura 4. Tela inicial do Drools Guvnor.

X"V#**&%"\ @0*#".*%% 2"("6 032*0(&2)()$")$"2!-.*#'(#"$"$-.*#'(#" !"#$.*%2'<#2*")$"#$;#(%+",(#("2!-.*#'(#" !" #$.*%2'<#2*" )$" $-$!.&*%" 5 $" @$!" = 0'*" 3*!"*"(#5 2@*")$")*d&*()"6(7("*"%$; 20'$8"@9"('B"(" (C(" :)!202%'#('*#/" %$&$32*0$" J!.*#'jA-.*#'/" 3&25 $" no botão Choose File e selecione o arquivo mortga-;$1%(!.&$1#$.*%2'*#S+-!&" 5 $" >3(" )$0'#*" )(" .(%'(" bAI1JN[j3&(%%$%" )(" (.&23(7L*" )*" )#**&%" 0*" K*!-3('+":.<%"2%%*/" !"0*@*".(3*'$"%$#9"3#2()*"3G(!()*" !*#'";(;$%"3*!"(&; 0%"$-$!.&*%")$"#$;#(%+

D+"/#$&]C&I!1$&',&N#,,1%&W/54,#&$-)%&0!#&+.-,#0$',&/.&#!-,%+0)-rio de regras de exemplo.

,(#("("3#2(7L*")$" !("0*@("#$;#("@9"('B"("*.7L*" m0*d&$);$" I(%$%" $" %$&$32*0$" Z#$('$" N$d" 1n" N$d" P &$+"N("'$&("%$; 20'$/"(%"*.74$%"("%$; 2#".*)$!"%$#" usadas para a criação da regra:

» Business Rule – Guided Editor: permite que

uma regra seja criada usando um editor de re-;#(%"@2% (&"3*!*"%$"6*%%$" !"_d2H(#)`+

» DSL Business Rule (Text Editor): permite que !("#$;#("%$=("3#2()(" %(0)*" !"(#5 2@*1'$-'*" escrito em uma linguagem DSL.

» DRL Rule (Techinical Rule – Text Editor): permite que uma regra seja criada em um ar-5 2@*1'$-'*"$%3#2'*"

%(0)*"("%20'(-$"VPW"DV#*-ols Rule Language).

» Decision Table: permite que uma regra seja 3#2()(" %(0)*" !(" _K(C$&(" )$" V$32%L*`/" !(" .&(02&G(")*"A-3$&+

» Decision Table – Web – Guided Editor:

per-mite que uma regra seja criada usando uma Ta-bela de Decisão através de um editor visual do '2.*"_d2H(#)`+

<=.4.H1!"+%1%IDJ%J,4.?)-%?1#1%=#1;1481#%

com o Drools

!"#$%&'!()#&"*+!,$-'./!0..#*!1(,02!"+/3&4+!5$+! a criação das regras possa ser feita dentro do Eclipse e depois integradas a um repositório de regras.

67/7! 879+/! 7! &'*47#7:;.! <.! "#$%&'=! ->! '.! $"<74+! manager do Eclipse e crie um novo site apontando para a seguinte url: http://downloads.jboss.com/dro-.#*?$"<74+*&4+@A@?A!B+#+)&.'+!7!.":;.!CD BB!E/..#*!+! "/.**&%7!).3!7!&'*47#7:;.=!<+".&*!*+/>!'+)+**>/&.!/+&-'&)&7/!.!()#&"*+!137&*!<+47#F+*!-+/!/+8+/G')&7*2A

Figura 6. Instalando o plugin do Drools no Eclipse.

Criando um projeto de exemplo usando

o wizard do Eclipse (projeto

mundoj-drools-sample)

H"I*!/+&'&)&7/!.!()#&"*+!-.)G!J>!".<+!)/&7/!.!*+$! "/&3+&/.!"/.J+4.!E/..#*A!B+#+)&.'+!K+L!MN!O$#+!6/.-J+)4! 137'4+'F7! 7*! .":P+*! "7</P+*! J>! *+#+)&.'7<7*2A! 67/7! +Q+)$47/! *$7! "/&3+&/7! /+%/7=! .*! "7**.*! 7R7&Q.! <+-+3!*+/!)/&7<.*!1.!L&97/<!<.!()#&"*+!*+!+')7//+%7/>! de todos eles): » S/&+!$37!/+%/7!1$*7'<.!$3!8./374.!EOT2!U!7/-quivo Sample.drl. » S/&+!$3!R+7'!1<7<.!.$!874.2!U!6 C !J7-7!U!&'- '+/!)#7**+!V+**7%+!1<+'4/.!<.!7/5$&-.!E/..#*-Test.java). » S/&+! $37! R7*+! <+! ).'F+)&3+'4.! U! 74/7-W*! <7! )F737<7! <.! 3W4.<.! '+LO$#+D7*+! <7! )#7**+! DroolsTest. » S/&7/!$37!*+**;.!U!B474+8$#!.$!B474+#+**!U!74/7-vés da chamada do método newStatefulSes-sion.

(6)

objeto da classe Message.

» E&*"7/+!7*!/+%/7*!U!74/7-W*!<7!)F737<7!<.!3W-4.<.!Y/+H##O$#+*A

67/7! 4+*47/! *$7! "/&3+&/7! /+%/7=! +Q+)$4+! 7! )#7**+! DroolsTest.java.

Figura 7. Erro ao executar a classe DroolsTest.

B+!.!+//.!7)&37!7).'4+)+/=!'7!F./7!<+!-.)G!+Q+-)$47/!*$7!)#7**+!<+!4+*4+=!7<&)&.'+=!).3.!+Q4+/'7#!C7/! 7.!D$&#<!674F!<.!()#&"*+=!.!7/5$&-.!./%A+)#&"*+AJ<4AJ$-'&4A)./+Z[[[AJ7/! #.)7#&97<.! '7! "7*47! "#$%&'*! <.! *+$! ()#&"*+=! .'<+! [[[! W! 7! -+/*;.! <.! 7/5$&-.A! O.<+! '.-vamente a classe DroolsTest.java e veja o resultado.

Figura 8. Rodando novamente a classe DroolsTest.

Entendendo o que você acaba de fazer:

!.RJ+4.!V+**7%+!W!.!*+$!874.!.$!<7<.A!(#+!".**$&! dois atributos, uma String message e um int status.

! 7/5$&-.! B73"#+A</#! ".**$&! <$7*! /+%/7*! 1+*)/&-47*! $*7'<.! 7! *&'47Q+! EOT!U! E/..#*! O$#+! T7'%$7%+2A! H!"/&3+&/7!/+%/7!U!<+!'.3+!\+##.!]./#<!U!W!+Q+)$-tada quando o status do objeto Message informado W! &%$7#! ^! V+**7%+A\(TT ! 1).'*47'4+! <+)#7/7<7! '7! )#7**+! E/..#*0+*4AJ7-72A!H! *+%$'<7! /+%/7!U! <+! '.3+! ,..<R_+! U! W! +Q+)$47<7! 5$7'<.! .! *474$*! <.! .RJ+4.! V+**7%+!&'8./37<.!W!&%$7#!^!V+**7%+A, ED`(A

Quando esta classe é criada pelo nosso Eclipse .!-7#./!<.!)73".!B474$*!W!V+**7%+A\(TT A!(*47!/+-%/7!1<+!7)./<.!).3!'.**.!7/5$&-.!B73"#+A</#2!<+Y'+! 7! 3+'*7%+3! 13A*+4V+**7%+2! ).3.! a,..<R_+! )/$+#! L./#<b! +! *+47! .! *474$*! ).3! .! 3+*3.! -7#./! /+)+R&<.! 13A*+4V+**7%+2A E+*47!8./37=!7.!+Q+)$47/!7!)#7**+!E/..#*0+*4AJ7-7! &/>!*+/!+Q&R&<.!'.!).'*.#+!a\+##.!]./#<b!+!a,..<R_+! )/$+#!L./#<bA

Tente agora alterar o valor do campo status do .RJ+4.!V+**7%+!)/&7<.!"7/7!V+**7%+A, ED`(A!c$+! 3+'*7%+3!W!+Q&R&<7!'.!).'*.#+d

Crie novos objetos do tipo Message, não se es-queça de adicionar eles na Memória de Trabalho 1]./e&'%!V+3./_2!+!<&*"7/+!7*!/+%/7*!'.-73+'4+A

Criando outro projeto de regras a partir

!"#$%&#!"'()!*+,!"-.$ !*/ )!!012

f73.*! 7%./7! %+/7/! .$4/.! "/.J+4.! '.! ()#&"*+! )/&7'<.! 4.<.*! .*! 7/5$&-.*! '+)+**>/&.*A! X'&)&7#3+'4+! cria um novo projeto de regras sem nenhuma opção selecionada. gA! S/&+!*$7!/+%/7!17/5$&-.!/+%/7A</#2 package mundoj; import mundoj.Conta; rule “inicial” when

Conta( saldo < 100 ) // condição then

System.out.println(“Saldo da conta do banco é menor do que 100”); // consequência

End

Esta regra possui apenas uma condição, se o Sal-do da Conta for menor Sal-do que a mensagem “SalSal-do da ).'47!<.!R7').!W!3+'./!<.!5$+!ghhb!&/>!*+/!3.*4/7<7! no Console do Eclipse.

iA! S/&+!7!)#7**+!S.'47!1874.2 package mundoj;

publicclass Conta { privatelong saldo;

publiclong getSaldo() { return saldo; }

publicvoid setSaldo(long balance) { this.saldo = balance;

} } @A!S/&+!$37!)#7**+!C7-7!"7/7!<&*"7/7/!*$7!/+%/7 package mundoj; import java.io.InputStreamReader; import java.io.Reader; import org.drools.RuleBase; import org.drools.RuleBaseFactory;

(7)

import org.drools.WorkingMemory; import org.drools.compiler.PackageBuilder; import org.drools.rule.Package;

publicclass TestaRegras {

publicstatic !"#void main(String[] args) throws Exception {

/* uma Rule Base (ou base de conhecimento) é * reponsável por criar a

* memória de trabalho onde irá ser feito o “match” das regras */

RuleBase ruleBase = null;

/* aqui eu estou lendo o arquivo onde estão declaradas as minhas regras */

Reader source = new InputStreamReader( TestaRegras.class.getResourceAsStream( “/regra.drl”));

PackageBuilder builder = new $"%&"'()*+#,(-(); /*aqui eu estou adicionando no “Buider” de pacotes as regras lidas no passo anterior */

builder.addPackageFromDrl(source); Package pkg = builder.getPackage(); ruleBase = RuleBaseFactory.!(./*#()"0((); /* aqui eu estou adicionando na “Rule Base” o """""""""""""""""3"(4&!,+"5.+"&)#+#"&!-",! 41"41" +6$#78+1 de regras */

ruleBase.addPackage(pkg);

/* aqui eu crio a minha “Working Memory” ou memória de trabalho que é o “Runtime” onde eu irei disparar as minhas regras */

WorkingMemory workingMemory = ruleBase.newStatefulSession();

/* aqui eu crio o meu objeto Conta, que é o fato sobre o qual eu irei aplicar as minhas regras */

Conta account = new Conta(); account.setSaldo(-1);

/* aqui eu insiro na minha memória de trabalho os dados/fatos criados */

workingMemory.insert(account);

/* aqui eu disparo todas as regras existentes na minha memória de trabalho */

workingMemory. -(1##/*#(0();

} }

Criando o projeto no Guvnor e

executando as regras no Eclipse

(projeto mundoj-client-guvnor)

f73.*!7%./7!7<7"47/!.!"/.J+4.!5$+!)/&73.*!7'-teriormente no Eclipse direto no Guvnor e depois +Q+)$47/!7!/+%/7!"+#.!()#&"*+A!6/&3+&/.!)/&+!.!"/.J+4.! 3$'<.J!'.!,$-'./=!*+%$&'<.!.*!"7**.*!7R7&Q.j gA! H)+**+!7!kOT!<.!"/.J+4. iA! B+#+)&.'+=!'.!3+'$!#74+/7#=!7!.":;.!al'.L#+<-%+!D7*+*b!1D7*+*!<+!S.'F+)&3+'4.2!+!)/&+!$3! '.-.!"7)e7%+!1)F73+!<+!3$'<.J2

@A! Selecione o pacote criado e crie um novo

“De-)#7/74&-+!V.<+#b!)F737<.!aS.'47b

mA! S/&+!<.&*!74/&R$4.*j!*7#<.!<.!4&".!X'4+%+/!+!*47-4$*!<.!4&".!0+Q4

nA! Crie uma nova regra usando a opção DRL Rule 14+Q4! /$#+2! )F737<7!a&'&)&7#b! $*7'<.! .! )I<&%.! 7R7&Q. oA! S#&5$+!*.R/+!.!"7).4+=!*+#+)&.'+!(EX0!+!<+".&*! )#&5$+!+3!aD$&#<!67)e7%+b!+!%+/+!473RW3!$3! *'7"*F.4!)F737<.!aTH0(B0b rule “inicial” no-loop true dialect “mvel” when c: Conta( saldo < 0 ) then

c.setStatus( “Saldo da Conta é negativo!” ); update(c);

end

k4&#&9+! .! )I<&%.! 7)&37! "7/7! )/&7/! 7! /+%/7! 1&4+3! n2=!7R7&Q.!4+3.*!7*!Y%$/7*!5$+!<+3.'*4/73!).3.!.! novo projeto de regras deve ser criado no Guvnor.

Figura 9. !"#$ %& '()( *+,(-$ ,.+&+/( &%'/(0 '( 1%)'(" 2#-$& 345

(8)

Figura 115 :/#,#('$ %& '()( ;+,- -<*$ ,.+&+/( !('-+ 2#-$& 945

Figura 125 :/#,#('$ (= ,+&*(= =+7/( $ =-+-%= +( (>0$-( !('-+ 2#-$& ?45

Figura 135 !"#$ %&+ '()+ "$@"+ /( -#*( 6AB A%7$ 2-$C- $/#-("4 2#-$& D45

Figura 14. E/#-$ + "$@"+ ,"#+/+ *+"+ $ +/#,#('$ ( ,F/#@( *+==+/(

+,#&+ 2#-$& D45

Figura 155 GH( =$ $=I%$J+ /$ ,(&*#7+" ( *+,(-$ 2#-$& K45

Figura 165 !"#$ -+&>L& %& ='+*=.(- 2#-$& K45

H"I*! 7! )/&7:;.! <.! "/.J+4.! '.! ,$-'./=! )/&+! $3! novo projeto de regras no eclipse e coloque o código 7R7&Q.!+3!$37!)#7**+!<+!4+*4+A package mundoj; import org.drools.KnowledgeBase; import org.drools.agent.KnowledgeAgent; import org.drools.agent.KnowledgeAgentFactory; import"!)9: )!!01: +6$#,#!$:,;(+:<4&,=;(+> import org.drools.io.Resource; import org.drools.io.ResourceFactory; import org.drools.runtime.StatelessKnowledgeSession; publicclass ClientGuvnor {

publicstaticvoid main(String[] args) { Resource xml = null;

KnowledgeAgent kAgent = null; KnowledgeBase kBase = null;

StatelessKnowledgeSession workingMemory = null; 2-3 { xml = ResourceFactory.newClassPathResource( “mundoj.xml”); kAgent = KnowledgeAgentFactory. newKnowledgeAgent(“myagent”); kAgent."44#356"!'(7(2(xml); kBase = kAgent.'(28!9.#(,'()"0((); FactType fType = kBase.'(2:"%2;34((“mundoj”, “Conta”);

Object conta = fType.newInstance(); fType.set(conta, “saldo”, -1); workingMemory = kBase.

(9)

newStatelessKnowledgeSession(); workingMemory.execute(conta); System.out.println(fType.get(conta, “status”)); } catch (Exception e) { e.printStackTrace(); } !"##3 { kAgent.dispose(); } } }

S/&+! 473RW3! $3! 7/5$&-.! 3$'<.JAQ3#! 1)F7'%+- M*+42!.!5$7#!).'Y%$/7!$3!.$!37&*!/+".*&4I/&.!<+!/+-gras. <change-setxmlns=’http://drools.org/drools-5.0/ change-set’ xmlns:xs=’http://www.w3.org/2001/XMLSchema-instance’ xs:schemaLocation=’http://drools.org/drools-5.0/ change-set http://anonsvn.jboss.org/repos/labs/labs/jbossrules / trunk/drools-api/src/main/resources/change-set-1.0.0.xsd’> <add>

<resourcesource= ’http://localhost:8090/drools-guvnor/org.drools.guvnor.Guvnor/package/mundoj/ LATEST’ type=’PKG’/> </add> </change-set>

59!0+,(-"<=(0> !"+0

Muitas vezes, ao iniciar o desenvolvimento de um software perdemos bastante tempo escolhen-<.! 7*! 3+#F./+*! 4+)'.#.%&7*! +! "/>4&)7*=! 8+//73+'47*=! 7"#&)7'<.!->/&.*!"7</P+*!<+!"/.J+4.*!+4)A=!+!7)7R73.*! não dando a devida importância que as regras de ne-%I)&.!+Q&%+3A!k3!R.3!<+*+'-.#-+<./!".<+!).'F+)+/! 3$&4.!R+3!7*!/+%/7*!<+!'+%I)&.!<.!*.84L7/+!5$+!+*4>! 3.<+#7'<.=! +'4/+47'4.=! <&Y)&#3+'4+! ).'F+)+/>! 4;.! profundamente estas regras quanto à pessoa que lida ).3! +*4+*! "/.)+**.*! <+! '+%I)&.! '.! <&7M7M<&7A! H#W3! disso, como sabemos, o processo de negócio é que produz valor para os clientes e não o software.

67/7! /+*.#-+/! +**+*! "/.R#+37*=! .! CD BB! E/..#*! "/.-G!$37!&'4+/87)+!73&%>-+#!"7/7!5$+!.!a+*"+)&7#&*- 47b!<.!'+%I)&.!".**7!)/&7/=!74$7#&97/!+!37'4+/!7*!/+-gras de negócio sem a necessidade da ajuda do “espe-)&7#&*47b!<7!0XA!H&'<7!7**&3!7!a+5$&"+b!<+!0X!4+/>!*$7! importância, proporcionando com que estas regras criadas separadamente possam ser aproveitadas por todos os softwares que dependam delas na empresa.

Durante a leitura do artigo, realizamos uma in-4/.<$:;.!7.*!).')+&4.*!R>*&).*!<.!E+*+'-.#-&3+'4.! /&+'47<.!7!O+%/7*!$4&#&97'<.!.!E/..#*!(Q"+/4!1O$#+! Engine). Em seguida, mostramos como utilizar o Dro-ols Guvnor como uma interface web para o

Gerencia- 3+'4.!<7*!O+%/7*!<+!K+%I)&.!1D$*&'+**!O$#+!V7'7-%+/2A! 6./! Y3=! 7"/+*+'473.*! ).3.! $4&#&97/! .! "#$%&'! do Eclipe para o desenvolvimento de projetos para o E/..#*A! !7**$'4.!W!R7*47'4+!+Q4+'*.!+!.!.RJ+4&-.!<.! artigo foi o de chamar a atenção do leitor para a utili-dade da tecnologia.

!"#$%&'!()!(*+&,*'(-!./*0)1*!2/**,-http://www.jboss.org/drools/downloads

> Update Site para instalar o plugin do Drools no Eclipse http://downloads.jboss.com/drools/updatesite3.3/ > Documentação Drools Guvnor

!!"#$$%&'()*+&(()&,-$%,&&.($,/./0(/$1)2)3)4560.$%,&&.(7 -896&,7%&'($ !:.;(56-./$56%/<) !:.

> Documentação Drools Expert

!!"#$$%&'()*+&(()&,-$%,&&.($,/./0(/$1)2)3)4560.$%,&&.(7 /<"/,!7%&'($ !:.;(56-./$56%/<) !:.

I> ntrodução ao Drools Guvnor !!"#$$95:/&)'&:$=2>?331 @AB56-80-/6(AC/'.0,0!590(ADE5F5"G%50H http://en.wikipedia.org/wiki/Declarative_programming @AB56-80-/6(AI:"/,0!590(ADE5F5"G%50H http://en.wikipedia.org/wiki/Imperative_programming @AB56-80-/6(AJ("/'KL'0(A%/AC&:K65&ADCMB(HADE5F5"G%50H !!"#$$/6)N5F5"/%50)&,-$N5F5$C&:0567("/'5L';.06-80-/ @AO8(56/((AP8./AQ060-/:/6!AMR(!/:ADOPQMASAE5F5"G%50H !!"#$$/6)N5F5"/%50)&,-$N5F5$O8(56/((;,8./;:060-/:/6!; system @AT0!!/,6AQ0!' 56-ADE5F5"G%50H !!"#$$/6)N5F5"/%50)&,-$N5F5$T0!!/,6;:0!'

56-> Implementando a Lógica de Negócio com o Drools (Artigo IOQH !!"#$$NNN)5+:)'&:$%/9/.&"/,N&,F($*090$.5+,0,R$*7%,&&.($ @AE5F5AC,&&.( !!"#$$'&::865!R)*+&(()&,-$N5F5$UO&((P8./( @AO.&-AC,&&.(AVAUOTQ http://blog.athico.com/ @AO.&-A%&AP5'0,%&A4/,,/5,0 !!"#$$0,' 5!/'!8,/7*&8,60.)+.&-("&!)'&:$>3?3$3>$%,&&.(7 -896&,7/:7W7"0((&() !:. @AC&'8:/6!0XY&AT.8-56AJ'.5"(/ !!"#$$%&'()*+&(()&,-$!&&.($2)?)3)Q>$/6$-896&,;!&&.(;,/Z; guide/html_single/index.html @AB59,&AC,&&.(AUO&((AP8./(A1)3AC/9/.&"/,[(A\85%/ !!"#$$NNN)0:0]&6)'&:$C,&&.(7UO&((7P8./(7C/9/.&"/,(7 \85%/$%"$?^_W?`1=__ @AB59,&AUO&((AC,&&.(AO8(56/((AP8./( !!"#$$NNN)0:0]&6)'&:$UO&((7C,&&.(7O8(56/((7P8./(7 O,&N6/$%"$?^_W?`=3=2

/referências

Referências

Documentos relacionados

o Houve ainda a pontuação de algumas(ns) profissionais sobre a dificuldade na contratação de funcionários(as) como um dos entraves para a constituição de um serviço de

parâmetro aproximado, pois esse foi um processo lento, que interagiu com a ideologia da Idade Média e que foi atravessado por ela durante todo o seu desenvolvimento. O que se percebe

É necessário também a realização de pesquisas sobre a área de design abordada no projeto, a animação no estilo motion graphics para que seja possível representar o

O ensino da História do município de Campina Grande vai proporcionar ao aluno uma melhor compreensão do passado, como foi ocorrendo todas as transformações econômicas,

Espera-se ainda, que grande parte do que foi aprendido no decorrer do curso possa ser aplicado no projeto, visto que ele abrange um grande número de conceitos,

Nas duas entrevistas realizadas, os entrevistados relatam que quando utilizavam carro como meio de transporte, não observavam detalhes durante o percurso, devido

destacar que além de fazer parte de um projeto de extensão e do programa do governo Museu da Escola, este trabalho de “tirar os documentos do silêncio e

Considerando a formação da equipe de trabalho, o tempo de realização previsto no projeto de extensão e a especificidade das necessidades dos catadores, algumas