1. Drools Flow
Dal process workflow al rules workflow
Cagliari Jug Sardegna – 29/05/2010 -
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
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. BRMS
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
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. 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. 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. 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. 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. 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. 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. 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. generic
Drools Flow
?
Decision
Services
SCOPE
Process
Rules
specific
tightly coupled COUPLING loosely coupled
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
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. 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 -
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. 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. 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. 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. 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. 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. 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. 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. Drools Flow
RuleFlow
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
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. Drools Flow
RuleFlow
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -
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. 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. 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. 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. 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 -
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. 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. 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. ???
giomarigi Giovanni Marigi – JBoss User Group Roma Coordinator -