protected ExecutableRunner getRunner( Long processInstanceId, ProcessJobContext ctx ) { RuntimeEngine runtime = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); if (runtime == null) { throw new RuntimeException("No runtime engine found, could not be initialized yet"); } try { if (runtime.getKieSession() instanceof CommandBasedStatefulKnowledgeSession) { CommandBasedStatefulKnowledgeSession cmd = (CommandBasedStatefulKnowledgeSession) runtime.getKieSession(); if (ctx != null) { ctx.setKnowledgeRuntime((InternalKnowledgeRuntime) ( (SingleSessionCommandService) cmd.getRunner() ).getKieSession() ); } return new DisposableCommandService(cmd.getRunner(), manager, runtime, schedulerService.retryEnabled()); } else if (runtime.getKieSession() instanceof InternalKnowledgeRuntime && ctx != null) { ctx.setKnowledgeRuntime((InternalKnowledgeRuntime) runtime.getKieSession()); } return new DisposableCommandService(getRunner(), manager, runtime, schedulerService.retryEnabled()); } catch (Throwable e) { // since the DisposableCommandService was not created dispose runtime engine directly manager.disposeRuntimeEngine(runtime); throw new RuntimeException(e); } }
@Test public void testBasicScriptFailure() { RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); KieSession ksession1 = runtime1.getKieSession(); assertNotNull(ksession1); try { ksession1.startProcess("BrokenScriptTask"); fail("Start process should fail due to broken script"); } catch (Throwable e) { // expected } manager.disposeRuntimeEngine(runtime1); ExecutionErrorManager errorManager = ((AbstractRuntimeManager) manager).getExecutionErrorManager(); ExecutionErrorStorage storage = errorManager.getStorage(); List<ExecutionError> errors = storage.list(0, 10); assertNotNull(errors); assertEquals(1, errors.size()); assertExecutionError(errors.get(0), "Process", "BrokenScriptTask", "Hello"); }
public ScheduledTaskDeadline call() throws Exception { RuntimeManager runtimeManager = null; RuntimeEngine engine = null; CommandExecutor executor = null; if (deploymentId != null && processInstanceId != null) { runtimeManager = RuntimeManagerRegistry.get().getManager(deploymentId); engine = runtimeManager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); executor = engine.getTaskService(); } else { executor = TaskDeadlinesServiceImpl.getInstance(); } try { executor.execute(new ExecuteDeadlinesCommand(taskId, deadlineId, type)); } catch (NullPointerException e) { logger.error("TaskDeadlineService instance is not available, most likely was not properly initialized - Job did not run!"); } finally { if (runtimeManager != null && engine != null) { runtimeManager.disposeRuntimeEngine(engine); } } return null; }
@Test public void testUserTransaction() throws Exception { UserTransaction ut = (UserTransaction) new InitialContext().lookup( JtaTransactionManager.DEFAULT_USER_TRANSACTION_NAME ); ut.begin(); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); KieSession ksession = getKieSession(); ProcessInstance processInstance = ksession.startProcess(SCRIPT_TASK_PROCESS_ID); ProcessInstanceLog instanceLog = getLogService().findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_COMPLETED, instanceLog.getStatus().intValue()); ut.commit(); manager.disposeRuntimeEngine(engine); } }
@Test public void testInMemorySessionCleanup() { for ( int i = 0; i < 20; i++ ) { Context<?> context = getContext(); RuntimeEngine runtime = manager.getRuntimeEngine(context); KieSession ksession = runtime.getKieSession(); ProcessInstance pi = ksession.startProcess("ScriptTask"); assertEquals(ProcessInstance.STATE_COMPLETED, pi.getState()); manager.disposeRuntimeEngine( runtime ); if ("case".equals(strategy)) { ((PerCaseRuntimeManager) manager).destroyCase((CaseContext) context); } } InMemorySessionFactory factory = (InMemorySessionFactory) ((AbstractRuntimeManager) manager).getFactory(); int expectedSessionsInFactory = getExpectedSessionsInFactory(); assertEquals(expectedSessionsInFactory, factory.getSessions().size()); }
@Test public void testUserTransaction() throws Exception { UserTransaction ut = (UserTransaction) new InitialContext().lookup( JtaTransactionManager.DEFAULT_USER_TRANSACTION_NAME ); ut.begin(); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); KieSession ksession = getKieSession(); ProcessInstance processInstance = ksession.startProcess(SCRIPT_TASK_PROCESS_ID); ProcessInstanceLog instanceLog = getLogService().findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_COMPLETED, instanceLog.getStatus().intValue()); ut.commit(); manager.disposeRuntimeEngine(engine); } }
@Override public void run() { try { Thread.sleep(1000); RuntimeEngine engine = runtimeManager.getRuntimeEngine(EmptyContext.get());// only for singleton logger.debug("staring a thread...."); engine.getKieSession().insert("doing it async"); logger.debug("Completing the work item"); engine.getKieSession().getWorkItemManager().completeWorkItem(workItem.getId(), null); runtimeManager.disposeRuntimeEngine(engine); } catch (Exception e) { logger.error("Error when executing async operation", e); } }
@Override public void execute(JobContext ctx) { RuntimeManager runtimeManager = null; RuntimeEngine engine = null; CommandExecutor executor = null; if (deploymentId != null && processInstanceId != null) { runtimeManager = RuntimeManagerRegistry.get().getManager(deploymentId); engine = runtimeManager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); executor = engine.getTaskService(); } else { executor = TaskDeadlinesServiceImpl.getInstance(); } try { executor.execute(new ExecuteDeadlinesCommand(taskId, deadlineId, type)); } catch (NullPointerException e) { logger.error("TaskDeadlineService instance is not available, most likely was not properly initialized - Job did not run!"); } finally { if (runtimeManager != null && engine != null) { runtimeManager.disposeRuntimeEngine(engine); } } }
public void testMultiInstanceCallactivityCompleteAtTheSameTime(Context<?> startContext) { // start first process instance with first manager RuntimeEngine runtime1 = manager.getRuntimeEngine(startContext); KieSession ksession1 = runtime1.getKieSession(); assertNotNull(ksession1); List<String> items = new ArrayList<String>(); for (int i = 0; i < numberOfChildProcesses; i++) { items.add(i + ""); } Map<String, Object> params = new HashMap<String, Object>(); params.put("items", items); ProcessInstance processInstance = ksession1.startProcess("test.Parent", params); manager.disposeRuntimeEngine(runtime1); countDownListener.waitTillCompleted(); JPAAuditLogService auditService = new JPAAuditLogService(emf); // process instance 1 should be completed by signal ProcessInstanceLog pi1Log = auditService.findProcessInstance(processInstance.getId()); assertNotNull(pi1Log); assertEquals(ProcessInstance.STATE_COMPLETED, pi1Log.getStatus().intValue()); auditService.dispose(); // close manager which will close session maintained by the manager manager.close(); }
@Test public void testAuditLogFromRuntimeEngine() throws Exception { KieSession ksession = getKieSession(); final ProcessInstance processInstance = ksession.startProcess(SAMPLE_HELLO_PROCESS_ID); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); AuditService logService = engine.getAuditService(); org.kie.api.runtime.manager.audit.ProcessInstanceLog instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ACTIVE, instanceLog.getStatus().intValue()); ksession.abortProcessInstance(processInstance.getId()); instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ABORTED, instanceLog.getStatus().intValue()); manager.disposeRuntimeEngine(engine); }
@Override public ExecutionResults execute(CommandContext ctx) throws Exception { String deploymentId = (String) ctx.getData("deploymentId"); if (deploymentId == null) { deploymentId = (String) ctx.getData("DeploymentId"); } Long processInstanceId = (Long) ctx.getData("processInstanceId"); if (processInstanceId == null) { processInstanceId = (Long) ctx.getData("ProcessInstanceId"); } String signal = (String) ctx.getData("Signal"); Object event = ctx.getData("Event"); if (deploymentId == null || signal == null) { throw new IllegalArgumentException("Deployment id and signal name is required"); } RuntimeManager runtimeManager = RuntimeManagerRegistry.get().getManager(deploymentId); if (runtimeManager == null) { throw new IllegalArgumentException("No runtime manager found for deployment id " + deploymentId); } RuntimeEngine engine = runtimeManager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId)); try { engine.getKieSession().signalEvent(signal, event, processInstanceId); return new ExecutionResults(); } finally { runtimeManager.disposeRuntimeEngine(engine); } }
@SuppressWarnings("unchecked") @Test public void testPerRequestManagerDestorySession() { assertEquals(0, sessions.size()); RuntimeEngine runtime = manager.getRuntimeEngine(EmptyContext.get()); runtime.getKieSession(); assertEquals(1, sessions.size()); KieSession ksession = runtime.getKieSession(); assertNotNull(ksession); ProcessInstance pi1 = ksession.startProcess("UserTask"); assertEquals(ProcessInstance.STATE_ACTIVE, pi1.getState()); manager.disposeRuntimeEngine(runtime); assertEquals(0, sessions.size()); runtime = manager.getRuntimeEngine(EmptyContext.get()); ksession = runtime.getKieSession(); manager.disposeRuntimeEngine(runtime); sessions = em.createQuery("from SessionInfo").getResultList(); assertEquals(0, sessions.size());
@Test public void testAuditLog() throws Exception { KieSession ksession = getKieSession(); final ProcessInstance processInstance = ksession.startProcess(SAMPLE_HELLO_PROCESS_ID); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); AuditLogService logService = getLogService(); ProcessInstanceLog instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ACTIVE, instanceLog.getStatus().intValue()); ksession.abortProcessInstance(processInstance.getId()); instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ABORTED, instanceLog.getStatus().intValue()); manager.disposeRuntimeEngine(engine); }
private void startProcessWithParamsAndTrigger(String processId, Map<String, Object> params, String type, boolean dispose) { RuntimeManager manager = (RuntimeManager) kruntime.getEnvironment().get(EnvironmentName.RUNTIME_MANAGER); if (manager != null) { org.kie.api.runtime.manager.Context<?> context = ProcessInstanceIdContext.get(); String caseId = (String) kruntime.getEnvironment().get(EnvironmentName.CASE_ID); if (caseId != null) { context = CaseContext.get(caseId); } RuntimeEngine runtime = manager.getRuntimeEngine(context); KieSession ksession = runtime.getKieSession(); try { ksession.execute(new StartProcessWithTypeCommand(processId, params, type)); } finally { if (dispose) { manager.disposeRuntimeEngine(runtime); } } } else { startProcess( processId, params, type ); } }
@Test public void testScriptFailureAfterUserTask() { RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); KieSession ksession1 = runtime1.getKieSession(); assertNotNull(ksession1); ProcessInstance pi = ksession1.startProcess("UserTaskWithRollback"); manager.disposeRuntimeEngine(runtime1); runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get(pi.getId())); ksession1 = runtime1.getKieSession(); assertEquals(1, tasks.size()); manager.disposeRuntimeEngine(runtime1); assertNotNull(errors); assertEquals(1, errors.size()); assertExecutionError(errors.get(0), "Process", "UserTaskWithRollback", "Script Task 1");
@Test public void testAuditLogFromRuntimeEngine() throws Exception { KieSession ksession = getKieSession(); final ProcessInstance processInstance = ksession.startProcess(SAMPLE_HELLO_PROCESS_ID); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); AuditService logService = engine.getAuditService(); org.kie.api.runtime.manager.audit.ProcessInstanceLog instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ACTIVE, instanceLog.getStatus().intValue()); ksession.abortProcessInstance(processInstance.getId()); instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ABORTED, instanceLog.getStatus().intValue()); manager.disposeRuntimeEngine(engine); }
private void testCompleteTaskViaWrongRuntimeManager() { RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); KieSession ksession1 = runtime1.getKieSession(); assertNotNull(ksession1); ProcessInstance processInstance = ksession1.startProcess("UserTask"); manager.disposeRuntimeEngine(runtime1); RuntimeEngine runtime2 = manager2.getRuntimeEngine(ProcessInstanceIdContext.get()); KieSession ksession2 = runtime2.getKieSession(); assertNotNull(ksession2); ProcessInstance processInstance2 = ksession2.startProcess("UserTask"); manager2.disposeRuntimeEngine(runtime2); runtime2 = manager2.getRuntimeEngine(ProcessInstanceIdContext.get(processInstance2.getId())); List<Long> tasks1 = runtime2.getTaskService().getTasksByProcessInstanceId(processInstance.getId()); assertEquals(1, tasks1.size()); fail("Should not be allowed to complete task via wrong runtime manager"); } catch (IllegalStateException re) { assertEquals("Task instance " + task1Id + " is owned by another deployment expected first found second" , re.getMessage()); manager2.disposeRuntimeEngine(runtime2);
@Test public void testAuditLog() throws Exception { KieSession ksession = getKieSession(); final ProcessInstance processInstance = ksession.startProcess(SAMPLE_HELLO_PROCESS_ID); RuntimeManager manager = getManager(); RuntimeEngine engine = getEngine(); AuditLogService logService = getLogService(); ProcessInstanceLog instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ACTIVE, instanceLog.getStatus().intValue()); ksession.abortProcessInstance(processInstance.getId()); instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ABORTED, instanceLog.getStatus().intValue()); manager.disposeRuntimeEngine(engine); }
@Test public void testFailureAfterUserTaskNoWorkItemHandler() { RuntimeEngine runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get()); KieSession ksession1 = runtime1.getKieSession(); assertNotNull(ksession1); ProcessInstance pi = ksession1.startProcess("UserTaskWithCustomTask"); manager.disposeRuntimeEngine(runtime1); runtime1 = manager.getRuntimeEngine(ProcessInstanceIdContext.get(pi.getId())); ksession1 = runtime1.getKieSession(); assertEquals(1, tasks.size()); manager.disposeRuntimeEngine(runtime1); assertNotNull(errors); assertEquals(1, errors.size()); assertExecutionError(errors.get(0), "Process", "UserTaskWithCustomTask", "Manual Task 2"); String errorMessage = errors.get(0).getErrorMessage();
/** * Simple test to verify that application is operational even without context factory defined. */ @Test public void testSimpleTaskInvocation() throws Exception { RuntimeManager manager = getManager(); AuditLogService logService = getLogService(); RuntimeEngine engine = getEngine(); KieSession ksession = getKieSession(); ProcessInstance processInstance = ksession.startProcess(SAMPLE_HELLO_PROCESS_ID); System.out.println("Process started"); ProcessInstanceLog instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ACTIVE, instanceLog.getStatus().intValue()); ksession.abortProcessInstance(processInstance.getId()); System.out.println("Process instance aborted"); instanceLog = logService.findProcessInstance(processInstance.getId()); assertNotNull(instanceLog); assertEquals(ProcessInstance.STATE_ABORTED, instanceLog.getStatus().intValue()); manager.disposeRuntimeEngine(engine); } }