November 2009 - JSR-299 Context & Dependency Injection
JavadayIV - A look Inside JBoss Rules
1. A look inside JBossRules A look inside JBossRules “ Dal BRMS al BLiP” “ Perchè dovrei usare un Rule Engine? E che cosa ci faccio?” “ Business Rules VS Metodi di Business” “ Oltre il BPM... BPM+Rules” “ E quando ( quando?quasi sempre! ) il business è praticamente scritto su fogli excel???” “ Sistemi Esperti? BRL?? Pattern Matching??? Rete???? AI????? ”
2. A look inside JBossRules Avvertimenti “programmare a regole”, usare motori di regole, può portarci spesso ad “esagerare” e a “ voler sparare ad una mosca con un cannone” ma allo stesso tempo sono sicuro che in moltissime delle applicazioni su cui avete o state lavorando ci sarebbe spazio per le regole... anche perchè (come spero ve ne accorgerete :-) e come spero si possa sfatare un falso mito ) OO programming + rules formano un binomio perfetto!
3.
4. Uno dei coordinatori del JBoss User Group Roma http://www.jbugroma.org http://tech.groups.yahoo.com/group/roma-jbug
14. A look inside JBossRules “ I computer sono incredibilmente veloci, accurati e stupidi. Gli uomini sono incredibilmente lenti, inaccurati e intelligenti. Insieme sono una potenza che supera l'immaginazione” (Albert Einstein)
15. Sistemi Esperti VS Programmazione Apps, Programs, Facts Solutions, Decisions, Actions Expert System Inference Engine Production Memory Knowledge Base Interface REGOLE IF-THEN REGOLE IF-THEN REGOLE IF-THEN RULES REGOLE IF-THEN REGOLE IF-THEN REGOLE IF-THEN FACTS
16. Sistemi Esperti VS Programmazione Un sistema esperto può essere definito come un modulo software che cerca di riprodurre il comportamento e il modo di ragionamento che una o più persone attuerebbero in uno specifico dominio di cui sono esperti. “ Può un sistema esperto emulare le prestazione di un umano? Un sistema esperto non equivale a dire sistema intelligente! Un sistema può apprendere, può essere semi-intelligente ma avrà sempre una conoscenza limitata! Un sistema esperto deve agire in domini limitati !”
17. Sistemi Esperti VS Programmazione Un sistema esperto specifica cosa il nostro modulo deve fare e non come farlo!!! Usa euristiche e non è detto che arrivi sempre a una soluzione e nel caso in cui la trovi non è detto che sia ottima e corretta. Lo sviluppatore non definisce i passi per arrivare alla soluzione, ma essi sono impliciti ! Definire logica di business attraverso un linguaggio di programmazione implica anche (e soprattutto) scrivere come il nostro modulo deve implementarla (if else, switch,loop, polimorfismo,ecc...). Gli algoritmi sono delle sequenze esplicite (scritte quindi dal programmatore) “ Riusciremo sempre a scrivere una logica corretta e robusta?” “E le prestazioni? (es.complessità asintoti ca)” “E se la logica cambia?”
18. Sistemi Esperti VS Programmazione Fonte: http://www.codeproject.com/KB/work/Business_Rules_Systems.aspx z Logic and data separation In un sistema esperto gli oggetti di dominio (fatti) contengono le proprietà distintive dell'oggetto(stato) La logica (i metodi di business dei domain object) viene separata dall'oggetto e definita attraverso un insieme di production rules . Cross domain logic “Decentralizzare” lo stato dalle regole permette di utilizzare da più oggetti, da controllers, uno stesso insieme di regole “ Vi è mai capitato di scrivere in più parti del vostro progetto dei metodi molto simili (a prescindere dal fatto che l'oggetto su cui lavori sia di un tipo o di un altro tipo? Non mentite!!!) “
19. Sistemi Esperti VS Programmazione Fonte: http://www.ibm.com/developerworks/library/ar-busrules2/fig03.gif
20. Sistemi Esperti VS Programmazione Open the box Le regole possono essere gestite ed amministrate non solo dagli sviluppatori e dagli architetti ma addirittura dal cliente stesso (od altri stakeholders) -> concetto di business ownership ... “ Se pensate che questa sia una limitazione al nostro lavoro pensate invece alla possibilità di creare sistemi con una lifetime e una flexibility estrema. E se il sistema sta in piedi per tanto tempo e bene,questa significa: fiducia, nuovi sviluppi, nuovi scenari...” “Business decisions are everywhere...why to hide them?” Open to changes Cambiare, aggiungere, rimuovere regole di business è diverso da cambiare,aggiungere, rimuovere dei metodi o accorgersi di dover stravolgere il design di qualche modulo perchè ci hanno chiesto una change request... “Se la logica di business cambia velocemente un sistema esperto basato su regole può diventare non solo una soluzione ma la soluzione.”
21. Applicazione dei sistemi esperti Un sistema esperto deve essere applicato per risolvere classi di problemi non banali e che non possono essere risolti con algoritmi e “metodi tradizionali” La definizione è sicuramente vera ed è indubbio che molti problemi possono essere solamente risolti con un sistema esperto... ma...
22. Applicazione dei sistemi esperti La logica può anche essere non così complessa ma soggetta a numerosi cambiamenti (aggiunte,variazioni,”potature”) Il business è definito da un numero elevato di condizioni , difficili da assemblare e da “mettere insieme” Il business risiede in “fonti” diverse e difficili da integrare nel codice in modo organico (fogli excel,procedure DBMS,metodi di business “infarciti” di if..else, switch, loop) Un sistema esperto apprende ...molte condizioni che saremmo costretti a scrivere nel codice nel tempo potrebbero venirci gratis
23.
24. Routing e Filtering es. antispam – instradamento di messaggi verso le destinazioni con le migliori caratteristiche
25. Pianificazione e Schedulazione di risorse es. creazione di piani efficienti di distribuzione della forza lavoro in sistemi di WFM
26. Forecasting e Previsioning es. andamento mercati finanziari, previsione del rischio in polizze assicurative, analisi curve di traffico in sistemi di WFM per prevedere una forza lavoro
32. No team must have more than 3 consecutive home or 3 consecutive away matches.
33. No repeaters: no 2 consecutive matches of the same 2 opposing teams. Minimize the total distance traveled by all teams. Il problema può sembrare semplice ma non sono state trovate soluzioni ottime anche per N piccoli!!! Un TSP Fonte: http://blog.athico.com/ Alcune soluzioni battle proven: http://mat.tepper.cmu.edu/TOURN
34. JBossRules/Drools 5 Chiariamo subito che JBossRules e Drools sono la stessa cosa dal punto di vista dei moduli software. Drools diventa JBossRules nella versione “enterprise”, ovvero quando viene venduto all'utente finale con il supporto RedHat e con il bug fixing incluso. Come tutti i progetti JBoss, Drools è sviluppato interamente da committer all'interno della community jboss.org L'ultima release di Drools è la 5.0 del maggio 2009
35. JBossRules/Drools 5 JBoss Community projects are for individual developers who want to integrate, maintain and support their projects themselves. JBoss Enterprise products are for Enterprise Developers who are building applications for businesses and public sector institutions that are planned to go into production or require tested, integrated software with certified patches and updates, and/or SLA-based support with a declared Support Policy from Red Hat.
36. JBossRules/Drools 5 Drools 5 può essere, senza essere troppo pretenziosi, definito una vera rivoluzione. Con Drools 5 non si parla più solamente di BRMS ma di una piattaforma unificata in cui trovano spazio un Rule Engine (Expert), un BRMS (Guvnor), un Rules Workflow engine,BPM+Rules (Flow), un Event Processing Engine driven by Rules (Fusion) e un Solver “ non è ancora stata creata un img per il solver...” Con Drools 5 il BRMS diventa solo uno dei componenti di una piattaforma unificata e completa per realizzare sistemi esperti basati su regole... Una piattaforma di questo tipo è denominata BLiP , Business Logic integration Platform
37. Drools Expert Drools Expert è un motore di regole (Rule Engine) con un motore inferenziale di tipo forward chaining che sfrutta un implementazione “object-oriented” dell'algoritmo Rete Drools Expert permette quindi di realizzare sistemi esperti in cui la base di conoscenza è costituita da fatti e da un insieme di business rules (o production rules). Un software del genere viene classificato come Production Rule System Drools Expert è “costruito” sulle specifiche JSR-94 JSR-000094 JavaTM Rule Engine API Un Rule Engine è di fatto il fondamento su cui si basano tutti gli altri moduli che costituiscono un BLiP (tra cui il BRMS, Drools Guvnor)
38. Drools Expert Fonte Drools Official Documentation: http://www.jboss.org/drools
39. Drools Expert: WorkingMemory I fatti vengono immagazzinati in un'area denominata WorkingMemory e non sono quindi parte della Knowledge Base ( ProductionMemory ). I fatti sono infatti legati ad una KnowledgeSession (pensate ad una sessione Hibernate) I fatti non sono altro che oggetti di dominio (pojo) e rappresentano “l'esperienza” che un sistema esperto possiede ed acquisisce rispetto ad un dominio su cui lavora e ragiona In Drools Expert una sessione può essere stateless ( StatelessKnowledgeSession ) o stateful ( StatefulKnowledgeSession ) L'interfaccia WorkingMemoryEntryPoint fornisce i metodi di accesso alla WorkingMemory, in modo da poter manipolare i fatti (insert-update-remove) Una WorkingMemory può essere “partizionata” in modo tale da isolare tipologie di fatti fra di loro
41. Drools Expert: ProductionMemory Un qualsiasi motore di inferenza per poter prendere delle decisioni e compiere azioni deve “confrontare” la sua esperienzadeterminata dai fatti con un insieme di regole (Production Rules). Questo processo viene chiamato Pattern Matching. In Drools vengono caricate non solo regole ma anche funzioni,processi, type models Le regole sono dei predicati espressi nella semplice forma: when <condition/s> then <action/s> Il business di un qualsiasi modulo software è espresso attraverso regole; un linguaggio di programmazione tradizionale tende ad allontanarsi e a realizzare in una forma diversa (sovra-struttura) un insieme di requisiti condizione-azione
42. Drools Expert: ProductionMemory Expert supporta la definizione di regole in Java, Python, Groovy e MVEL. Si possono definire regole attraverso la definizione di DSL! Le regole possono risiedere in file *.drl , oppure possono venir caricate da fonti esterne, diverse ed etereogenee ( changeset feature). C'è supporto per tutti i protocolli definiti in java.net.URL + caricamento da classpath Oltre a file *.drl possono venir caricate decision table in formato *.xls (resource-type DTABLE), il contenuto di una cartella,... <xs:simpleType name="ResourceType"> <xs:restriction base="xs:string"> <xs:enumeration value="DRL"/> <xs:enumeration value="XDRL"/> <xs:enumeration value="DSL"/> <xs:enumeration value="DSLR"/> <xs:enumeration value="DRF"/> <xs:enumeration value="DTABLE"/> <xs:enumeration value="PKG"/> <xs:enumeration value="BRL"/> <xs:enumeration value="CHANGE_SET"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="DecTabInpType"> <xs:restriction base="xs:string"> <xs:enumeration value="XLS"/> <xs:enumeration value="CSV"/> </xs:restriction> </xs:simpleType>
43. Drools Expert: ProductionMemory Tutte le regole (ma anche eventuali processi, decision tables) formano la knowledge base (ProductionMemory), costruita in Expert come un vero e proprio repository. I fatti non sono parte della base di conoscenza ma vengono inseriti a partire da sessioni di lavoro creati da una base di conoscenza su cui si vuole “inferire” qualcosa! Costruire una knowledge base è un processo che richiede risorse--> “cacharla” quando è possibile!
45. Drools Expert: Pattern Matching Torniamo al Pattern Matching... Esistono due modalità con cui un motore inferenziale può ragionare utilizzando regole: Forward Chaining e Backword Chaining Drools Expert usa esclusivamente il meccanismo di Forward Chaining! Il Forward Chaining è un meccanismo di ragionamento data-driven in quanto il processo parte dai fatti... Tra le regole di inferenza che applica quella basilare è il modus ponens in logica... [(A --> B) ∧ A] --> B FC cerca fra le regole finchè non ne trova una che può asserire come vera eseguendone quindi la parte then Sono i fatti iniziali che determinano quale insieme di regole FC deve considerare. La parte then può tramutarsi in azioni, decisioni o aggiornamenti sullo stato dei fatti. Questo meccanismo continua finchè un obiettivo prefissato viene raggiunto. Non è detto che tutte le regole vengano “scatenate”! (anzi)
46. Drools Expert: Pattern Matching Fonte Drools Official Documentation: http://www.jboss.org/drools
47. Drools Expert: Rete Expert come algoritmo di pattern matching di tipo forward chaining usa Rete Rete fu inventato e formalizzato dal Dott. Charles Forgy Rete è l'algoritmo più famoso ed utilizzato dai motori di regole presenti al momento sul mercato... lo usa anche JRules di ILog Expert implementa una versione di Rete chiamata ReteOO ottimizzata per lavorare su oggetti Per una spiegazione esaudiente di come lavora Rete (non abbiamo tempo :-( ) * Charles Forgy, "On the efficient implementation of production systems." Ph.D. Thesis, Carnegie-Mellon University, 1979. * Charles Forgy, "Rete: A Fast Algorithm for the Many Pattern/Many Object Pattern Match Problem", Artificial Intelligence, 19, pp 17–37, 1982 * RedHat Documentation
48. Drools Expert: Demo Fatti: Ordini,Estratto Conto Regole: Condizioni che il sito da cui compro applica sugli ordini effettuati e da evadere. Le condizioni sono relative all'anno 2010 Obiettivi/Azioni: Sapere quanto ho speso e quanti punti premio ho accumulato Stateless/Stateful: Stateless
49. Drools Expert: Demo “ Nel caso di un ordine base, l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto comprato ed incrementando il saldo punti fedeltà ” “ Nel caso di un ordine su un oggetto che prevede uno sconto,l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto a cui viene applicata la % di sconto ed incrementando il saldo punti fedeltà ” “ Nel caso di un ordine su un oggetto che prevede uno sconto e nel caso in cui il cliente utilizzi per l'acquisto dei punti fedeltà,l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto a cui viene applicata la % di sconto; il prezzo viene ulteriormente decrementato di una % di sconto pari a 0.1% * il numero di punti utilizzati. Il saldo punti deve essere incrementato secondo il valore determinato da: punti previsti per l'oggetto – punti fedeltà spes i” “ La spedizione tramite Corriere costa 4 euro, tramite Pacco Celere 3 euro, tramite posta prioritaria 2 euro ”
50. Drools Expert: Demo “ Nel caso di un ordine base, l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto comprato ed incrementando il saldo punti fedeltà ” “ Nel caso di un ordine su un oggetto che prevede uno sconto,l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto a cui viene applicata la % di sconto ed incrementando il saldo punti fedeltà ” “ Nel caso di un ordine su un oggetto che prevede uno sconto e nel caso in cui il cliente utilizzi per l'acquisto dei punti fedeltà,l'estratto conto del cliente deve essere aggiornato addebitando il prezzo dell'oggetto a cui viene applicata la % di sconto; il prezzo viene ulteriormente decrementato di una % di sconto pari a 0.1% * il numero di punti utilizzati. Il saldo punti deve essere incrementato secondo il valore determinato da: punti previsti per l'oggetto – punti fedeltà spes i” “ La spedizione tramite Corriere costa 4 euro, tramite Pacco Celere 3 euro, tramite posta prioritaria 2 euro ”
51. Drools Expert: Demo Plugin per Eclipse 3.4 (e superiori) per poter creare progetti Drools http://www.jboss.org/drools/downloads.html http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk JSE 1.5.x Componenti necessari: - drools-core.jar: il rule engine di expert - drools-compiler.jar: compilazione ed installazione delle regole nella production memory - drools-api.jar: interfacce e factories Extra: - drools-decisiontables.jar: compilatore per regole inserite in file xls e csv Bug: org.eclipse.jdt.core_3.5.1.v_972_R35x.jar va messo come external jar
52. Drools Expert: Demo Editor testaule e grafico per creare business rule Wizard per creare Drools Project Rules Debugging Rules Code Assist Eclipse View sui vari componenti di Expert: WorkingMemoryView AuditView AgendaView
54. Drools Expert: Demo package it.gmarigi.javaday2010.drools.rules import it.gmarigi.javaday2010.drools.pojo.Ordine; import it.gmarigi.javaday2010.drools.pojo.Bilancio; rule "acquisto base" when bilancio : Bilancio() Ordine( $nomeOggetto:nomeOggetto, $prezzo : prezzo, $puntiAcquisiti:puntiAcquisiti, puntiSpesi == null, scontoUsato == null) then bilancio.aggiungiOrdine( $nomeOggetto,$prezzo,$puntiAcquisiti); end rule "acquisto con sconto" when bilancio : Bilancio() Ordine( $nomeOggetto:nomeOggetto, $prezzo : prezzo, $scontoUsato : scontoUsato, $puntiAcquisiti:puntiAcquisiti, puntiSpesi == null, scontoUsato != null) then bilancio.aggiungiOrdine($nomeOggetto,$prezzo-(($prezzo*$scontoUsato)/100),$puntiAcquisiti); end Ordini.drl
55. Drools Expert: Demo rule "acquisto con sconto ed utilizzo punti" when bilancio : Bilancio() Ordine( $nomeOggetto:nomeOggetto, $prezzo : prezzo, $scontoUsato : scontoUsato, $puntiAcquisiti:puntiAcquisiti, $puntiSpesi:puntiSpesi, puntiSpesi != null, scontoUsato != null) then bilancio.aggiungiOrdine($nomeOggetto, $prezzo - (($prezzo*$scontoUsato)/100) (($prezzo*($puntiSpesi*0.1f))/100) ,$puntiAcquisiti-$puntiSpesi); end rule "Spedizione Corriere" when $bilancio : Bilancio() Ordine(tipoSpedizione=="CORRIERE") then $bilancio.setSommaSpesa($bilancio.getSommaSpesa()+4f); end rule "Spedizione Pacco Celere" when $bilancio : Bilancio() Ordine(tipoSpedizione=="PACCO CELERE") then $bilancio.setSommaSpesa($bilancio.getSommaSpesa()+3f); end
56. Drools Expert: Demo rule "Spedizione Posta Prioritaria" when $bilancio : Bilancio() Ordine(tipoSpedizione=="POSTA PRIORITARIA") then $bilancio.setSommaSpesa($bilancio.getSommaSpesa()+2f); end rule "Stampa Bilancio" salience -100 when $bilancio : Bilancio() then System.out.println("Bilancio di["+$bilancio.getNominativo()+"]Somma Spesa:"+ $bilancio.getSommaSpesa()+"(euro)Punti Accumulati:"+ $bilancio.getPuntiTotali() ); end Il rule language di Drools è molto potente e completo -> doc ufficiale Il simbolo $ fa sì che la variabile sia utilizzabile anche nella parte then di una regola Il rule language è molto “java-oriented” L'azione definita nella regola "Stampa Bilancio" è un azione “didattica”;questa regola non è propriamente una business rule
57. Drools Expert: Demo // Creazione Working memory(Base di conoscenza ) kbase = KnowledgeUtil. readKnowledgeBase (); // Creazione sessione ksession = kbase.newStatefulKnowledgeSession(); // Aggiunta event handlers alla sessione (auditing sui componenti del rule engine) KnowledgeUtil. addCustomListeners (ksession); //Logging su file logger = KnowledgeRuntimeLoggerFactory. newFileLogger (ksession, "ordini" ); /***********************CREAZIONE FATTI**********************************/ Ordine ordine1 = new Ordine( "RAM 2GB" , "15/03/2010" ,100f); ordine1.setPuntiAcquisiti(50); ordine1.setTipoSpedizione( "CORRIERE" ); ........ Bilancio bilancio = new Bilancio(); bilancio.setNominativo( "Antonio Rossi" ); /**********************************************************************/ // Inserimento dei fatti nella working memory ksession.insert(ordine1); ksession.insert(ordine2); ksession.insert(ordine3); ksession.insert(ordine4); ksession.insert(bilancio); //Pattern matching con tutte le production rules ksession.fireAllRules(); La sessione di lavoro valuterà tutte le regole sui fatti inseriti -> fireAllRules
58. Drools Expert: Demo Dovendo valutare tutte le regole della production memory, per un determinato set di fatti è possibile che esattamente tutte le regole definite vengano soddisfatte (con la conseguente azione associata) Nel nostro caso quindi è molto probabile che l'azione associata alla regola “Stampa Bilancio” venga eseguita non per ultima! (e quindi non sapremo il bilancio finale relativo ai nostri 4 ordini ) Quello che succede è che esistono più Activations che vanno in conflitto fra di loro. Le activations vengono accumulate in un modulo del Rule Engine chiamato Agenda Agenda deve avere una funzione che gli permette di risolvere i vari conflitti fra regole e per poterli risolvere deve attuare una determinata strategia
59. Drools Expert: Demo rule "Stampa Bilancio" salience -100 when $bilancio : Bilancio() then System.out.println("Bilancio di["+$bilancio.getNominativo()+"]Somma Spesa:"+ $bilancio.getSommaSpesa()+"(euro)Punti Accumulati:"+ $bilancio.getPuntiTotali() ); end Si può istruire Agenda (e quindi suggerirle una strategia) applicando una priorità di esecuzione sulle regole (salience) Per default tutte le regole hanno un salience pari a 0. Mettendo sulla regola "Stampa Bilancio" una salience negativa siamo sicuri che l'azione di questa regola verrà eseguita per ultima
60. Drools Expert: Demo “ Vorrei che gli ordini siano stampati in ordine sulla base della loro data di evasione...” Nella sessione vista avevano un motore inferenziale che non aveva bisogno di aggiornare (e quindi acquisire esperienza) la sua base di conoscenza con lo stato interno dei fatti! Questa sessione era per natura una sessione stateless; sessioni di questo tipo vengono usate per decision service type scenarios (StatelessKnowledgeSession) Nella demo abbiamo usato una sessione stateful (StatefulKnowledgeSession) solamente per poter sfruttare il metodo fireAllRules()...ma la natura era stateless Per garantire questo requisito il motore inferenziale deve quantomeno poter ordinare sulla base della data evasione i fatti che deve valutare... questa è inferenza!
61. Drools Expert: Demo rule "Stampa Ordini" salience -100 when $ordine : Ordine( $data : data) not Ordine( data < $data) then System.out.println("Ordine: "+$ordine); retract($ordine); end La regola “Stampa Ordine” istruisce il motore di regole a rimuovere un fatto dalla WorkingMemory... in questo modo avremo una stampa degli ordini coerente con il requisito Otterremo anche che al termine della valutazione di questa regola la working memory non avrà più esperienza di alcun fatto (per questo va eseguita per ultima altrimenti comprometterebbe le altre regole di business) Sulla WM si può fare insert,update,retract
62. BRMS: Drools Guvnor Il BRMS (Business Rules Management System) in Drools 5 è realizzato dal modulo Drools Guvnor Un BRMS non è altro che un ambiente (tipicamente una web-application) che permette di lavorare e di gestire set di business rules offrendo delle viste user friendly Attraverso il BRMS il dominio e le regole su cui esso si basa, vengono resi gestibili ed amministrabili da diversi stakeholders : business analysts,developers,il cliente stesso. Occorre anche individuare amministratori di un BRMS! Guvnor permette di fare versioning delle regole (historicals assets) e di organizzare le regole in categorie. Le regole in Guvnor si chiamano Assets Possono essere creati users con differenti ruoli sul BRMS
63. BRMS: Drools Guvnor Guvnor è una web-application (.war); può essere “deployata” su qualsiasi Application Server http://<your-app-server>/drools-guvnor Usa come repository per gli assets e per tutti gli oggetti che amministra Apache JackRabbit . Per default il data store è su file, potete comunque decidere di mettere il repository su un qualsiasi RDBMS Potete sincronizzare sul repository di Guvnor i progetti Drools che create con Eclipse direttamente dall'IDE Il Rule GUI Editor in Guvnor ha molte più funzionalità di quello che c'è in Eclipse... (non bisogna per forza essere degli esperti in scrittura di rules per usare Guvnor )