-
Notifications
You must be signed in to change notification settings - Fork 13
/
RulesWorkItemHandler.java.debug
92 lines (73 loc) · 3.32 KB
/
RulesWorkItemHandler.java.debug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package org.acme.insurance.policyquote.wih;
import java.util.Collection;
import org.drools.compiler.kproject.ReleaseIdImpl;
import org.kie.api.KieBase;
import org.kie.api.KieServices;
import org.kie.api.builder.KieScanner;
import org.kie.api.builder.ReleaseId;
import org.kie.api.definition.KiePackage;
import org.kie.api.definition.rule.Rule;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.kie.api.runtime.process.WorkItem;
import org.kie.api.runtime.process.WorkItemHandler;
import org.kie.api.runtime.process.WorkItemManager;
import org.kie.internal.runtime.Cacheable;
import org.kie.api.runtime.process.ProcessInstance;
public class RulesWorkItemHandler implements WorkItemHandler, Cacheable {
private ReleaseId releaseId;
private KieContainer kieContainer;
private KieScanner kieScanner;
public RulesWorkItemHandler(String releaseIdStr, ClassLoader classLoader) {
releaseId = new ReleaseIdImpl(releaseIdStr);
KieServices ks = KieServices.Factory.get();
kieContainer = ks.newKieContainer(releaseId, classLoader);
// Iterate and print list of rules loaded in KieBase
Collection<KiePackage> kPackages = kieContainer.getKieBase().getKiePackages();
for(KiePackage kPackage : kPackages) {
Collection<Rule> rules = kPackage.getRules();
for(Rule rule : rules) {
System.out.println(kPackage.getName()+" : Following rule found: "+rule.getName());
}
}
kieScanner = ks.newKieScanner(kieContainer);
kieScanner.start(10000L);
}
@Override
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
String kieSessionName = (String)workItem.getParameter("kieSession");
String processId = (String)workItem.getParameter("processId");
StringBuilder sBuilder = new StringBuilder("executeWorkItem() \n\tExecuting rules for releaseId " + releaseId);
sBuilder.append("\n\tkieSessionName = "+kieSessionName);
sBuilder.append("\n\tprocessId = "+processId);
System.out.println(sBuilder.toString());
KieSession kieSession;
if (kieSessionName == null || kieSessionName.isEmpty()) {
kieSession = kieContainer.newKieSession();
} else {
kieSession = kieContainer.newKieSession(kieSessionName);
}
for (String param : workItem.getParameters().keySet()) {
if (param.startsWith("fact_")) {
kieSession.insert(workItem.getParameter(param));
}
}
if (processId != null && !processId.isEmpty()) {
ProcessInstance pInstance = kieSession.startProcess(processId);
if(pInstance == null)
throw new RuntimeException("executeWorkItem() pInstance not created with processId = "+processId);
}
int numRulesFired = kieSession.fireAllRules();
System.out.println("\nNumber of rules fired = "+numRulesFired);
kieSession.dispose();
manager.completeWorkItem(workItem.getId(), workItem.getParameters());
}
@Override
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
// TODO Auto-generated method stub
}
@Override
public void close() {
kieScanner.stop();
}
}