may 2010 - drools flow

37
Drools Flow Drools Flow Dal process workflow al rules workflow Dal process workflow al rules workflow Giovanni Marigi – JBoss User Group Roma Coordinator - giomarigi Cagliari Jug Sardegna – 29/05/2010 -

Upload: jbug-italy

Post on 05-Dec-2014

4.236 views

Category:

Technology


2 download

DESCRIPTION

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

TRANSCRIPT

Page 1: May 2010 - Drools flow

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 -

Page 2: May 2010 - Drools flow

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

Page 3: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

BRMSBRMS

Page 4: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

Drools 5: BLiPDrools 5: BLiP

Business Logic integration System

DroolsGuvnor

DroolsFusion

DroolsFlow

DroolsExpert

Page 5: May 2010 - Drools flow

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

Page 6: May 2010 - Drools flow

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

Page 7: May 2010 - Drools flow

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

Page 8: May 2010 - Drools flow

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

Page 9: May 2010 - Drools flow

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.

Page 10: May 2010 - Drools flow

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.

Page 11: May 2010 - Drools flow

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

Page 12: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

Drools FlowDrools Flow

loosely coupledtightly coupled

spec

ific

gene

ric

DecisionServices

ProcessRules

SC

OP

E

COUPLING

?

Page 13: May 2010 - Drools flow

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

Page 14: May 2010 - Drools flow

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

Page 15: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

Drools FlowDrools Flow

Page 16: May 2010 - Drools 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>

Page 17: May 2010 - Drools flow

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();

Page 18: May 2010 - Drools flow

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

Page 19: May 2010 - Drools flow

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>

Page 20: May 2010 - Drools flow

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,...

Page 21: May 2010 - Drools flow

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”

Page 22: May 2010 - Drools flow

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

Page 23: May 2010 - Drools flow

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

Page 24: May 2010 - Drools flow

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...

Page 25: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

Drools FlowDrools Flow

RuleFlow

Page 26: May 2010 - Drools flow

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

Page 27: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

Drools FlowDrools Flow

RuleFlow

Page 28: May 2010 - Drools flow

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

Page 29: May 2010 - Drools flow

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" ]]

Page 30: May 2010 - Drools flow

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

Page 31: May 2010 - Drools flow

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()); } }}

Page 32: May 2010 - Drools flow

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)

Page 33: May 2010 - Drools flow

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>

Page 34: May 2010 - Drools flow

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 );

Page 35: May 2010 - Drools flow

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

Page 36: May 2010 - Drools flow

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

Page 37: May 2010 - Drools flow

Giovanni Marigi – JBoss User Group Roma Coordinator -giomarigi

??????