use of org.drools.runtime.process.ProcessInstance in project jBPM5-Developer-Guide by Salaboy.
the class AdvancedProcessAndRulesIntegrationTest method processEventsTest.
@Test
public void processEventsTest() throws InterruptedException {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(new ClassPathResource("evolution/mapping.drl"), ResourceType.DRL);
kbuilder.add(new ClassPathResource("evolution/scoring_processVariables_wider.drl"), ResourceType.DRL);
kbuilder.add(new ClassPathResource("evolution/process-events-decision.bpmn"), ResourceType.BPMN2);
if (kbuilder.hasErrors()) {
for (KnowledgeBuilderError error : kbuilder.getErrors()) {
System.out.println(">>> Error:" + error.getMessage());
}
fail(">>> Knowledge couldn't be parsed! ");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new WorkItemHandler() {
public void executeWorkItem(WorkItem wi, WorkItemManager wim) {
System.out.println(" >>> Completing Task! -> " + wi.getName() + " - id: " + wi.getId());
wim.completeWorkItem(wi.getId(), null);
}
public void abortWorkItem(WorkItem wi, WorkItemManager wim) {
throw new UnsupportedOperationException("Not supported yet.");
}
});
KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
ksession.addEventListener(new DefaultAgendaEventListener() {
@Override
public void activationCreated(ActivationCreatedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).fireAllRules();
}
@Override
public void afterRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).fireAllRules();
}
});
Person person = new Person("Salaboy", 28);
RatesToday ratesToday = new RatesToday(1, 100);
Map<String, Object> params = new HashMap<String, Object>();
params.put("person", person);
params.put("ratesToday", ratesToday);
ProcessInstance processInstance = ksession.createProcessInstance("com.salaboy.process.SimpleDecision", params);
System.out.println("Variables: " + ((WorkflowProcessInstanceImpl) processInstance).getVariables());
assertEquals(processInstance.getState(), ProcessInstance.STATE_PENDING);
final FactHandle processHandle = ksession.insert(processInstance);
((StatefulKnowledgeSessionImpl) ksession).addEventListener(new DefaultProcessEventListener() {
@Override
public void beforeProcessStarted(ProcessStartedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).fireAllRules();
}
@Override
public void afterProcessStarted(ProcessStartedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).fireAllRules();
}
@Override
public void afterProcessCompleted(ProcessCompletedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).retract(processHandle);
}
});
ksession.startProcessInstance(processInstance.getId());
Thread.sleep(1000);
// // If you want to query the process variables while the process Instance is running you can do:
// QueryResults queryResults = ksession.getQueryResults("allProcessVariables", new Object[]{});
// Iterator<QueryResultsRow> iterator = queryResults.iterator();
//
// QueryResultsRow ratesRow = iterator.next();
// assertEquals(ratesToday, ((ProcessVariable) ratesRow.get("$pv")).getValue());
//
// QueryResultsRow personRow = iterator.next();
// assertEquals(person, ((ProcessVariable) personRow.get("$pv")).getValue());
assertEquals(processInstance.getState(), ProcessInstance.STATE_COMPLETED);
QueryResults queryResults = ksession.getQueryResults("allProcessVariables", new Object[] {});
// The Process Variables are automatically retracted when the Process Instance is Completed
assertEquals(0, queryResults.size());
}
use of org.drools.runtime.process.ProcessInstance in project jBPM5-Developer-Guide by Salaboy.
the class ProcessAndHumanTasksTest method testProcessWithHumanTasks.
@Test
public void testProcessWithHumanTasks() throws InterruptedException {
StatefulKnowledgeSession ksession = this.initializeSession();
KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
GenericHTWorkItemHandler htHandler = this.createTaskHandler(ksession);
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", htHandler);
Map<String, Object> initialParams = new HashMap<String, Object>();
initialParams.put("user_self_evaluation", "calcacuervo");
ProcessInstance processInstance = ksession.startProcess("chapter_07_simple_review", initialParams);
assertEquals(ProcessInstance.STATE_ACTIVE, processInstance.getState());
// first, calcacuervo will make its own review..
List<TaskSummary> tasks = this.service.getTasksAssignedAsPotentialOwner("calcacuervo", "en-UK");
assertEquals(1, tasks.size());
this.service.start(tasks.get(0).getId(), "calcacuervo");
this.service.complete(tasks.get(0).getId(), "calcacuervo", null);
// now, a user with role TL will see the task.. esteban is one of them
List<TaskSummary> estebanTasks = this.service.getTasksAssignedAsPotentialOwner("esteban", "en-UK");
Assert.assertEquals(1, estebanTasks.size());
this.service.claim(estebanTasks.get(0).getId(), "esteban");
this.service.start(estebanTasks.get(0).getId(), "esteban");
this.service.complete(estebanTasks.get(0).getId(), "esteban", null);
// now, a user with role HR will see the task.. mariano is one of them
List<TaskSummary> marianoTasks = this.service.getTasksAssignedAsPotentialOwner("mariano", "en-UK");
Assert.assertEquals(1, marianoTasks.size());
this.service.claim(marianoTasks.get(0).getId(), "mariano");
this.service.start(marianoTasks.get(0).getId(), "mariano");
this.service.complete(marianoTasks.get(0).getId(), "mariano", null);
assertEquals(ProcessInstance.STATE_COMPLETED, processInstance.getState());
}
use of org.drools.runtime.process.ProcessInstance in project jBPM5-Developer-Guide by Salaboy.
the class PersistentProcessTest method processInstancePersistentAsyncTest.
@Test
public void processInstancePersistentAsyncTest() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(new ClassPathResource("process-async-interactions.bpmn"), ResourceType.BPMN2);
if (kbuilder.hasErrors()) {
for (KnowledgeBuilderError error : kbuilder.getErrors()) {
System.out.println(">>> Error:" + error.getMessage());
}
fail(">>> Knowledge couldn't be parsed! ");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
Environment env = EnvironmentFactory.newEnvironment();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.runtime");
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
// Let's create a Persistence Knowledge Session
System.out.println(" >>> Let's create a Persistent Knowledge Session");
final StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
int sessionId = ksession.getId();
assertNotNull(sessionId);
assertTrue(sessionId != 0);
// We need to register the WorkItems and Listeners that the session will use
MockAsyncHTWorkItemHandler mockAsyncHTWorkItemHandler = new MockAsyncHTWorkItemHandler();
MockExternalServiceWorkItemHandler mockExternalServiceWorkItemHandler = new MockExternalServiceWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", mockAsyncHTWorkItemHandler);
ksession.getWorkItemManager().registerWorkItemHandler("External Service Call", mockExternalServiceWorkItemHandler);
//KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
// Let's create a Process Instance
Person person = new Person("Salaboy", 29);
Map<String, Object> params = new HashMap<String, Object>();
params.put("person", person);
//Each Command will generate an interaction
System.out.println(" >>> Let's Create Process Instance");
ProcessInstance processInstance = ksession.createProcessInstance("com.salaboy.process.AsyncInteractions", params);
System.out.println(" >>> Let's Start the Process Instance");
ksession.startProcessInstance(processInstance.getId());
//Now we need to manually complete the Human Interaction to continue the process
System.out.println(">>> Completing the first Human Interaction");
ksession.getWorkItemManager().completeWorkItem(mockAsyncHTWorkItemHandler.getId(), null);
// It will execute the automatic external interaction and then another Human Interaction will need to be completed
System.out.println(">>> Completing the second Human Interaction");
ksession.getWorkItemManager().completeWorkItem(mockAsyncHTWorkItemHandler.getId(), null);
// We need to dispose the session, because the reference to this ksession object will no longer be valid
// because another thread could load the same session and execute a different command.
System.out.println(">>> Disposing Session");
ksession.dispose();
}
use of org.drools.runtime.process.ProcessInstance in project jBPM5-Developer-Guide by Salaboy.
the class PersistentProcessTest method processInstancesPersistenceFaultTest.
@Test
public void processInstancesPersistenceFaultTest() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(new ClassPathResource("process-async-interactions.bpmn"), ResourceType.BPMN2);
if (kbuilder.hasErrors()) {
for (KnowledgeBuilderError error : kbuilder.getErrors()) {
System.out.println(">>> Error:" + error.getMessage());
}
fail(">>> Knowledge couldn't be parsed! ");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
Environment env = EnvironmentFactory.newEnvironment();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.runtime");
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
// Let's create a Persistence Knowledge Session
System.out.println(" >>> Let's create a Persistent Knowledge Session");
final StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
int sessionId = ksession.getId();
assertNotNull(sessionId);
assertTrue(sessionId != 0);
// We need to register the WorkItems and Listeners that the session will use
MockHTWorkItemHandler mockHTWorkItemHandler = new MockHTWorkItemHandler();
MockFaultWorkItemHandler mockFaultWorkItemHandler = new MockFaultWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", mockHTWorkItemHandler);
ksession.getWorkItemManager().registerWorkItemHandler("External Service Call", mockFaultWorkItemHandler);
//KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
// Let's create a Process Instance
Person person = new Person("Salaboy", 29);
Map<String, Object> params = new HashMap<String, Object>();
params.put("person", person);
//Each Command will generate an interaction
System.out.println(">>> Let's Create Process Instance");
ProcessInstance processInstance = ksession.createProcessInstance("com.salaboy.process.AsyncInteractions", params);
System.out.println(">>> Let's Start the Process Instance");
try {
ksession.startProcessInstance(processInstance.getId());
} catch (Exception e) {
assertTrue(e instanceof WorkflowRuntimeException);
System.out.println(">>> Disposing Session");
// We need to dispose the session, because the reference to this ksession object will no longer be valid
// because another thread could load the same session and execute a different command.
ksession.dispose();
// The startProcess transaction never gets commited.
EntityManager em = emf.createEntityManager();
// The ProcessInstance is in the same state as when it was created
List resultList = em.createQuery("select p from ProcessInstanceInfo p").getResultList();
assertEquals(1, resultList.size());
assertEquals(0, ((WorkflowProcessInstanceImpl) processInstance).getNodeInstances().size());
// No WorkItemInfo was commited.
resultList = em.createQuery("select w from WorkItemInfo w").getResultList();
assertEquals(0, resultList.size());
}
}
use of org.drools.runtime.process.ProcessInstance in project jBPM5-Developer-Guide by Salaboy.
the class PersistentProcessTest method processInstancePersistentTest.
@Test
public void processInstancePersistentTest() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(new ClassPathResource("process-async-interactions.bpmn"), ResourceType.BPMN2);
if (kbuilder.hasErrors()) {
for (KnowledgeBuilderError error : kbuilder.getErrors()) {
System.out.println(">>> Error:" + error.getMessage());
}
fail(">>> Knowledge couldn't be parsed! ");
}
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
Environment env = EnvironmentFactory.newEnvironment();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.runtime");
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
// Let's create a Persistence Knowledge Session
System.out.println(" >>> Let's create a Persistent Knowledge Session");
final StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
int sessionId = ksession.getId();
assertNotNull(sessionId);
assertTrue(sessionId != 0);
// We need to register the WorkItems and Listeners that the session will use
MockHTWorkItemHandler mockHTWorkItemHandler = new MockHTWorkItemHandler();
MockExternalServiceWorkItemHandler mockExternalServiceWorkItemHandler = new MockExternalServiceWorkItemHandler();
ksession.getWorkItemManager().registerWorkItemHandler("Human Task", mockHTWorkItemHandler);
ksession.getWorkItemManager().registerWorkItemHandler("External Service Call", mockExternalServiceWorkItemHandler);
//KnowledgeRuntimeLoggerFactory.newConsoleLogger(ksession);
// Let's create a Process Instance
Person person = new Person("Salaboy", 29);
Map<String, Object> params = new HashMap<String, Object>();
params.put("person", person);
//Each Command will generate an interaction
System.out.println(">>> Let's Create Process Instance");
ProcessInstance processInstance = ksession.createProcessInstance("com.salaboy.process.AsyncInteractions", params);
System.out.println(">>> Let's Start the Process Instance");
long processInstanceOne = processInstance.getId();
ksession.startProcessInstance(processInstanceOne);
// We need to dispose the session, because the reference to this ksession object will no longer be valid
// because another thread could load the same session and execute a different command.
System.out.println(">>> Disposing Session");
ksession.dispose();
// Let's reload the session and create a different process instance inside it
StatefulKnowledgeSession loadedKsession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env);
// All the listeners and WorkItemHandlers are volatile, so we need to register them each time that we reload the session
// from the DB.
loadedKsession.getWorkItemManager().registerWorkItemHandler("Human Task", mockHTWorkItemHandler);
loadedKsession.getWorkItemManager().registerWorkItemHandler("External Service Call", mockExternalServiceWorkItemHandler);
//KnowledgeRuntimeLoggerFactory.newConsoleLogger(loadedKsession);
//Let's create another instance and start it.
System.out.println(">>> Let's Create Process Instance");
processInstance = loadedKsession.createProcessInstance("com.salaboy.process.AsyncInteractions", params);
System.out.println(">>> Let's Start the Process Instance");
long processInstanceTwo = processInstance.getId();
loadedKsession.startProcessInstance(processInstanceTwo);
System.out.println(">>> Disposing Session");
loadedKsession.dispose();
StatefulKnowledgeSession checkKsession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env);
assertEquals(0, checkKsession.getProcessInstances().size());
checkKsession.dispose();
}
Aggregations