Jesus De Oliveira [https://community.jboss.org/people/jesus.deoliveira] created the discussion
"Re: How to make a process instance go on with jBPM5?" To view the discussion, visit: https://community.jboss.org/message/719772#719772 -------------------------------------------------------------- Hi, I also have found that you must force to complete the WorkItem after completing a human task. A more detailed and a little bit cleaner version of Melih and Donald approach also works perfectly, even when the human task server is running on a separate thread or JVM, provided that the process engine JPA persistence is correctly configured and the original statefull knowledge session is restored upon start-up. Some boilerplate code intentionally omitted for the sake of simplicity: // If no previous statefull knowledge session exists public void createStatefullKnowledgeSession() { //... create kbase, load process definitions, etc ... EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa"); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf); env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager()); ksessionStatefull = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env); int sessionId = ksessionStatefull.getId(); // *** STORE sessionId SOMEWHERE PERSISTENTLY, to be able to // recover this session later upon services restart } public void loadStatefullKnowledgeSession() { //... create kbase, load process definitions, etc ... EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa"); Environment env = KnowledgeBaseFactory.newEnvironment(); env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf); env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager()); // *** RECOVER sessionId FROM PERSISTENT STORAGE // and use it here to recover persisted process engine state ksessionStatefull = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env); } public void complete(long taskId, String userName) throws Exception { // ... create the TaskClient (client), and connect it to the task server ... // first mark the task as completed on the task server taskOperationHandler = new BlockingTaskOperationResponseHandler(); client.complete(taskId, userName, null, taskOperationHandler); taskOperationHandler.waitTillDone(1000); // then retrieve the task to extract the workItemId, where the process instance is waiting BlockingGetTaskResponseHandler responseHandler = new BlockingGetTaskResponseHandler(); client.getTask(taskId, responseHandler); responseHandler.waitTillDone(1000); Task task = responseHandler.getTask(); // force completition of the workItem associated with the task, on which the process instance is waiting final Map<String, Object> results = new HashMap<String, Object>(); ksessionStatefull.getWorkItemManager().completeWorkItem(task.getTaskData().getWorkItemId(), results); } Hope this will be useful to anyone, best regards! -------------------------------------------------------------- Reply to this message by going to Community [https://community.jboss.org/message/719772#719772] Start a new discussion in jBPM at Community [https://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]
_______________________________________________ jboss-user mailing list [email protected] https://lists.jboss.org/mailman/listinfo/jboss-user
