may 2010 - drools flow

Post on 05-Dec-2014

4.236 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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