May 2010 - Drools flow

3,599 views

Published on

Drools Flow - Giovanni Marigi
29/05/2010 - Jug Sardegna - JBoss User Group Roma

Published in: Technology, Business
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,599
On SlideShare
0
From Embeds
0
Number of Embeds
24
Actions
Shares
0
Downloads
164
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

May 2010 - Drools flow

  1. 1. Drools Flow Dal process workflow al rules workflow Cagliari Jug Sardegna – 29/05/2010 - giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  2. 2. About me ✔ System Architect per ValueTeam SPA http://www.valueteam.com ✔ Uno dei coordinatori del JBoss User Group Roma http://www.jbugroma.org http://tech.groups.yahoo.com/group/roma-jbug ✔ Membro e sostenitore delle attività del Jug Roma ✔ My buzzwords: BRMS – BPM – APM – JBoss platform – CI - GateIn Spring – Agile techniques - Flex – Python – pygtk – Grails - Debian ✔ Twitter: http://twitter.com/giomarigi giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  3. 3. BRMS giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  4. 4. Drools 5: BLiP Drools Drools Drools Drools Expert Flow Fusion Guvnor Business Logic integration System giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  5. 5. Drools 5: BLiP 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(Flow) un Event Processing Engine driven by Rules (Fusion) e un Planner Unica piattaforma per sviluppo di business solutions (driven by rules not by hard coded decisions!!!) Technology Overlap Business Overlap giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  6. 6. Drools Flow FlowChart → Business Workflow → Business & Rules Workflow → Drools Flow Drools Flow è un workflow engine che integra e unifica processi e regole Processi e regole vengono tipicamente considerati come paradigmi distinti e scarsamente integrabili nella realizzazioni della business logic giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  7. 7. Drools Flow Integrazione - assets diversi ma integrati nella definizione di workflow: rules, processes, events, DSL items, actions - diversi paradigmi nella realizzazione di workflow decision services vs process rules Unificazione - Common BLiP API - Support for different process languages (RuleFlow language – WS-BPEL – jPDL - OSWorkflow) - IDE, unified tooling, auditing and debugging giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  8. 8. Drools Flow Process Workflow caratteristiche Control flow Procedurale Long-living Focus è sull'integrazione con sistemi esterni Rules Workflow caratteristiche Data flow (rules flow) Dichiarativo Domini specifici Focus è sulla business logic giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  9. 9. Drools Flow Rules Workflow vantaggi (Drools Flow Official User Guide www.jboss.org/drools) Simplicity: Complex decisions are usually easier to specify using a set of rules. Rules can pinpoint complex business logic more easily, using their advanced constraint language. Multiple rules can be combined, each describing a part of the business logic. Agility: Rules and processes can have a separate life cycle. This means that we can change the rules describing some crucial decision points without having to change the process itself. Rules can be added, removed or modified to fine- tune the behavior of the process to the constantly evolving requirements and environment. Different scope: Rules can be reused across processes or outside processes. Therefore, your business logic is not locked inside your processes. giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  10. 10. Drools Flow Rules Workflow vantaggi (Drools Flow Official User Guide www.jboss.org/drools) Declarativeness: Focus on describing "what" instead of "how". Granularity: It is easy to write simple rules that handle specific circumstances. Processes are more suited to describe the overall control flow but tend to become very complex if they also need to describe a lot of exceptional situations. Performance: Rule evaluation is optimized. Advanced condition and action language: Rule languages support advanced features like custom functions, collections, conditional elements, including quantifiers, etc. High-level: By using DSLs, business editors, decision tables, and decision trees, your business logic could be described in a way that can be understood (and possibly even modified) by business users. giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  11. 11. Drools Flow Nei rules workflow la logica decisonale viene separata dalla logica di definizione del processo (decision service) I blocchi decisionali vengono realizzati attraverso business rules 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 giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  12. 12. generic Drools Flow ? Decision Services SCOPE Process Rules specific tightly coupled COUPLING loosely coupled giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  13. 13. Drools Flow - Download Drools jar - Download Drools Eclipse Plugin (3.4.x – 3.5.x) Ancora non disponibile plugin per IntelliJ IDEA (working in progress) Drools Runtime → folder with drools jar giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  14. 14. Drools Flow Rich palette start/end ruleflow group split/join wait states, timers, events, actions (mvel or java action) composite nodes, subflows human tasks Easy to use work items sending email finding files FTP google calendar instant messaging REST services RSS feeds executing system commands transforming data giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  15. 15. Drools Flow giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  16. 16. Drools Flow <?xml version="1.0" encoding="UTF-8"?> <process xmlns="http://drools.org/drools-5.0/process" xmlns:xs="http://www.w3.org/2001/XMLSchema-instance" xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd" type="RuleFlow" name="ruleflow" id="com.sample.ruleflow" package-name="com.sample" > <header/> <nodes> <start id="1" name="Start" x="16" y="16" /> <actionNode id="2" name="Hello" x="128" y="16" > <action type="expression" dialect="mvel">System.out.println("Hello World");</action> </actionNode> <end id="3" name="End" x="240" y="16" /> </nodes> <connections> <connection from="1" to="2" /> <connection from="2" to="3" /> </connections> </process> giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  17. 17. Drools Flow RuleFlowProcessFactory factory = RuleFlowProcessFactory.createProcess("org.drools.HelloWorldRuleSet"); factory // Header .name("HelloWorldRuleSet") .version("1.0") .packageName("org.drools") // Nodes .startNode(1).name("Start").done() .ruleSetNode(2) .name("RuleSet") .ruleFlowGroup("someGroup").done() .endNode(3).name("End").done() // Connections .connection(1, 2) .connection(2, 3); RuleFlowProcess process = factory.validate().getProcess(); giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  18. 18. Drools Flow Eseguire un Drools Rule Flow Process KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newClassPathResource("Prenotazioni.rf"),ResourceType.DRF ); KnowledgeBuilderErrors errors = kbuilder.getErrors(); In una knowledge base drools if (errors.size() > 0) { for (KnowledgeBuilderError error: errors) { ci sono tutti gli assets: System.err.println(error); rules, decison tables, process } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); ksession.startProcess("it.gmarigi.drools.PrenotazioniProcess"); ksession.fireAllRules(); giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  19. 19. Drools Flow RuleFlow Tutte le regole, processi, decision tables formano la knowledge base (ProductionMemory), costruita in Drools come un vero e proprio repository Costruire una knowledge base è un processo che richiede risorse--> “cacharla” quando è possibile! Le regole sono dei predicati espressi nella semplice forma: when <condition/s> then <action/s> giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  20. 20. Drools Flow RuleFlow Drools 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,... giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  21. 21. Drools Flow RuleFlow “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à spesi” “La spedizione tramite Corriere costa 4 euro, tramite Pacco Celere 3 euro, tramite posta prioritaria 2 euro” giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  22. 22. Drools Flow RuleFlow 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 giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  23. 23. Drools Flow RuleFlow package it.gmarigi.javaday2010.drools.rules import it.gmarigi.drools.pojo.Ordine; import it.gmarigi.drools.pojo.Bilancio; rule "acquisto base" ruleflow-group 'acquisti' 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" ruleflow-group 'acquisti' 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 giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  24. 24. Drools Flow RuleFlow rule "Spedizione Corriere" ruleflow-group 'spedizioni' when $bilancio : Bilancio() Ordine(tipoSpedizione=="CORRIERE") then $bilancio.setSommaSpesa($bilancio.getSommaSpesa()+4f); end rule "Spedizione Pacco Celere" ruleflow-group 'spedizioni' when $bilancio : Bilancio() Ordine(tipoSpedizione=="PACCO CELERE") then $bilancio.setSommaSpesa($bilancio.getSommaSpesa()+3f); end Non ci resta che usare le regole in un process workflow... giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  25. 25. Drools Flow RuleFlow giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  26. 26. Drools Flow RuleFlow Si possono definire regole (constraints) anche sui nodi decisionali del flow Uno Split (Spedizioni Tipo Cliente) è un nodo decisonale giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  27. 27. Drools Flow RuleFlow giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  28. 28. Drools Flow Pluggable work items Nodi che definiscono azioni, comportamenti specifici per un particolare dominio Possibilità di estendere le azioni standard offerte da Flow e di utilizzarle nell'IDE - domain-specific - declarative (what, not how) - high-level - customizable to the context giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  29. 29. Drools Flow Pluggable work items 1) Create a work item definition (mvel) an put it in your classpath PrenotazioneAereaDefinitions.conf import org.drools.process.core.datatype.impl.type.ObjectDataType; [ [ "name" : "Prenotazione Aerea", "parameters" : [ "Passeggero" : new ObjectDataType("it.gmarigi.drools.Passeggero"), "Aereo" : new ObjectDataType("it.gmarigi,drools.Aereo"), "Carta di Credito" : new ObjectDataType("it.gmarigi.drools.CartaDiCredito") ], "displayName" : "Prenotazione Aerea", "icon" : "icons/aereo.gif" ] ] giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  30. 30. Drools Flow Pluggable work items 2)Register the work definitions with the knowledge base configuration. Put a drools.rulebase.conf file in META-INF dir drools.workDefinitions = WorkDefinitions.conf PrenotazioneAereaDefinitions.conf giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  31. 31. Drools Flow Pluggable work items 3) Create a work item handler (what work item must do) public class PrenotazioneAereaWorkItemHandler implements WorkItemHandler { PrenotazioniService prenotazioniService; public void executeWorkItem(WorkItem workItem,WorkItemManager manager) { Passeggero passeggero = (Passeggero) workItem.getParameter("passeggero"); Aereo aereo = (Aereo) workItem.getParameter("aereo"); CartaDiCredito cc = (CartaDiCredito) workItem.getParameter("cc"); try { prenotazioniService.prenota(passeggero,aereo, cc); manager.completeWorkItem(workItem.getId(), null); } catch (Exception e) { e.printStackTrace(); manager.abortWorkItem(workItem.getId()); } } } giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  32. 32. Drools Flow Process Persistence - Default process instances non sono persistenti - Persistenza si crea attraverso JPA (Hibernate-IBatis- TopLink,ecc...) - Se la scelta è Hibernate: drools-persistence-jpa (org.drools) persistence-api-1.0.jar (javax.persistence) hibernate-entitymanager-3.4.0.GA.jar (org.hibernate) hibernate-annotations-3.4.0.GA.jar (org.hibernate) hibernate-commons-annotations-3.1.0.GA.jar (org.hibernate) hibernate-core-3.3.0.SP1.jar (org.hibernate) dom4j-1.6.1.jar (dom4j) jta-1.0.1B.jar (javax.transaction) btm-1.3.2.jar (org.codehaus.btm) javassist-3.4.GA.jar (javassist) slf4j-api-1.5.2.jar (org.slf4j) slf4j-jdk14-1.5.2.jar (org.slf4j) h2-1.0.77.jar (com.h2database) commons-collections-3.2.jar (commons-collections) giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  33. 33. Drools Flow Process Persistence <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <persistence version="1.0" xsi:schemaLocation= "http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd http://java.sun.com/xml/ns/persistence/orm http://java.sun.com/xml/ns/persistence/orm_1_0.xsd" xmlns:orm="http://java.sun.com/xml/ns/persistence/orm" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="org.drools.persistence.jpa"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <jta-data-source>jdbc/processInstanceDS</jta-data-source> <class>org.drools.persistence.session.SessionInfo</class> <class>org.drools.persistence.processinstance.ProcessInstanceInfo</class> <class>org.drools.persistence.processinstance.ProcessInstanceEventInfo</class> <class>org.drools.persistence.processinstance.WorkItemInfo</class> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/> <property name="hibernate.max_fetch_depth" value="3"/> <property name="hibernate.hbm2ddl.auto" value="update"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup"/> </properties> </persistence-unit> </persistence> giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  34. 34. Drools Flow Process Persistence // create the entity manager factory and register it in the environment EntityManagerFactory emf = Persistence.createEntityManagerFactory( "org.drools.persistence.jpa" ); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf ); // create a new knowledge session that uses JPA to store the runtime state StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env ); int sessionId = ksession.getId(); int processId = ksession.startProcess( "MyProcess" ); ksession.dispose(); // recreate the session from database using the sessionId ksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, null, env ); giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  35. 35. Drools Flow Process Persistence Quando l'istanza viene salvata? Viene salvata (ed aggiornata) ad ogni safe-point che si incontra nel processo Un safe-point coincide con un nodo action giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  36. 36. Keep Moving ✔Drools 5 http://www.jboss.org/drools ✔Drools Official Blog http://blog.athico.com ✔Drools Mailing List & Forum http://drools-java-rules-engine.46999.n3.nabble.com/ ✔Drools Wiki http://community.jboss.org/wiki/JBossRules ✔JBoss User Group Roma http://www.jbugroma.org giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
  37. 37. ??? giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -

×