Drools FlowDrools FlowDal process workflow al rules workflowDal process workflow al rules workflow
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Cagliari Jug Sardegna – 29/05/2010 -
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
✔ System Architect per ValueTeam SPAhttp://www.valueteam.com
✔ Uno dei coordinatori del JBoss User Group Romahttp://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 - GateInSpring – Agile techniques - Flex – Python – pygtk – Grails - Debian
✔ Twitter: http://twitter.com/giomarigi
About meAbout me
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
BRMSBRMS
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools 5: BLiPDrools 5: BLiP
Business Logic integration System
DroolsGuvnor
DroolsFusion
DroolsFlow
DroolsExpert
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools 5: BLiPDrools 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 OverlapBusiness Overlap
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Integrazione - assets diversi ma integrati nella definizione di workflow: rules, processes, events, DSL items, actions
- diversi paradigmi nella realizzazione di workflowdecision 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Process Workflow caratteristicheControl flowProceduraleLong-livingFocus è sull'integrazione con sistemi esterni
Rules Workflow caratteristicheData flow (rules flow)DichiarativoDomini specificiFocus è sulla business logic
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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.
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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.
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
loosely coupledtightly coupled
spec
ific
gene
ric
DecisionServices
ProcessRules
SC
OP
E
COUPLING
?
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools FlowRich palettestart/endruleflow groupsplit/join wait states, timers, events,actions (mvel or java action) composite nodes, subflowshuman tasks
Easy to use work itemssending emailfinding filesFTPgoogle calendarinstant messagingREST servicesRSS feedsexecuting system commandstransforming data
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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>
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools FlowRuleFlowProcessFactory 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();
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Eseguire un Drools Rule Flow ProcessKnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();kbuilder.add( ResourceFactory.newClassPathResource("Prenotazioni.rf"),ResourceType.DRF );
KnowledgeBuilderErrors errors = kbuilder.getErrors();if (errors.size() > 0) { for (KnowledgeBuilderError error: errors) { System.err.println(error); } 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();
In una knowledge base drools ci sono tutti gli assets: rules, decison tables, process
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlow
Tutte le regole, processi, decision tablesformano 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>
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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 classpathOltre a file *.drl possono venir caricate decision table in formato *.xls (resource-type DTABLE), il contenuto di una cartella,...
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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”
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlow
Fatti: Ordini,Estratto ContoRegole: Condizioni che il sito da cui compro applica sugli ordini effettuati e da evadere. Le condizioni sono relative all'anno 2010Obiettivi/Azioni: Sapere quanto ho speso e quanti punti premio ho accumulato
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlowpackage 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlowrule "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...
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlow
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Si possono definire regole (constraints) anche sui nodi decisionali del flow
RuleFlow
Uno Split (Spedizioni Tipo Cliente)è un nodo decisonale
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
RuleFlow
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Pluggable work items
1) Create a work item definition (mvel) an put it in your classpath
PrenotazioneAereaDefinitions.confimport 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" ]]
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Pluggable work items
2)Register the work definitions with the knowledge base configuration. Put a drools.rulebase.conf file in META-INF dirdrools.workDefinitions = WorkDefinitions.conf PrenotazioneAereaDefinitions.conf
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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()); } }}
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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)
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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>
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools Flow
Process Persistence
// create the entity manager factory and register it in the environmentEntityManagerFactory 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 stateStatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession( kbase, null, env );int sessionId = ksession.getId();
int processId = ksession.startProcess( "MyProcess" );ksession.dispose();
// recreate the session from database using the sessionIdksession = JPAKnowledgeService.loadStatefulKnowledgeSession( sessionId, kbase, null, env );
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Drools FlowDrools 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
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
Keep MovingKeep Moving
✔ Drools 5 http://www.jboss.org/drools
✔ Drools Official Bloghttp://blog.athico.com
✔ Drools Mailing List & Forumhttp://drools-java-rules-engine.46999.n3.nabble.com/
✔ Drools Wikihttp://community.jboss.org/wiki/JBossRules
✔ JBoss User Group Romahttp://www.jbugroma.org
Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi
??????
Top Related