random error when I launch the process
ivanice Nov 24, 2014 6:54 AMI have a process with the sequence "servicetask-humantask-servicetask".
I have used thread in the executeWorkItem.
when I launch 2 times the same process I lost a final service task, and sometimes the console return me any errors.
If i launch 2 different process with the same task I lost nothing, but the error appear yet.
the code of the main process is:
public class ProcessMain {
KieServices ks;
KieContainer kContainer;
KieBase kbase;
RuntimeManager manager;
RuntimeEngine engine;
KieSession ksession;
TaskService taskService;
AuditService logService;
Map<String, Object> paramsHello = new HashMap<String, Object>();
Map<String, Object> params = new HashMap<String, Object>();
public ProcessMain(){
this.ks = KieServices.Factory.get();
this.kContainer = ks.getKieClasspathContainer();
this.kbase = kContainer.getKieBase("kbase");
this.manager = createRuntimeManager(kbase);
this.engine = manager.getRuntimeEngine(null);
this.ksession = engine.getKieSession();
this.taskService = engine.getTaskService();
this.logService = engine.getAuditLogService();
ksession.getWorkItemManager().registerWorkItemHandler("Smile",(WorkItemHandler) new Smile(ksession));
paramsHello.put("variable1", "Saluti a tutti hello");
params.put("variable1", "Saluti a tutti");
}
public void start() {
ksession.startProcess("com.sample.bpmn.hello", paramsHello);
ksession.startProcess("com.sample.bpmn.hello", paramsHello);
// let john execute Task 1
List<TaskSummary> list = taskService.getTasksAssignedAsPotentialOwner("john", "en-UK");
TaskSummary task = list.get(0);
System.out.println("John is executing task " + task.getName());
taskService.start(task.getId(), "john");
taskService.complete(task.getId(), "john", null);
// let mary execute Task 2
list = taskService.getTasksAssignedAsPotentialOwner("mary", "en-UK");
task = list.get(0);
System.out.println("Mary is executing task " + task.getName());
taskService.start(task.getId(), "mary");
taskService.complete(task.getId(), "mary", null);
manager.disposeRuntimeEngine(engine);
System.exit(0);
}
private static RuntimeManager createRuntimeManager(KieBase kbase) {
JBPMHelper.startH2Server();
JBPMHelper.setupDataSource();
EntityManagerFactory emf = Persistence.createEntityManagerFactory("org.jbpm.persistence.jpa");
RuntimeEnvironmentBuilder builder = RuntimeEnvironmentBuilder.Factory.get()
.newDefaultBuilder().entityManagerFactory(emf)
.knowledgeBase(kbase);
return RuntimeManagerFactory.Factory.get()
.newSingletonRuntimeManager(builder.get(), "com.sample:example:1.0");
}
}
The code of workItem is:
public class Smile implements WorkItemHandler{
private KieSession ksession;
public Smile(KieSession ksession) {
this.ksession = ksession;
}
public void abortWorkItem(WorkItem workItem, WorkItemManager manager) {
manager.abortWorkItem(workItem.getId());
}
public void executeWorkItem(WorkItem workItem, WorkItemManager manager) {
final Object p= workItem.getParameter("param1");
final String deploymentId = nonNull(((WorkItemImpl)workItem).getDeploymentId());
final long processInstanceId = workItem.getProcessInstanceId();
final long workItemId = workItem.getId();
new Thread(new Runnable() {
public void run() {
System.out.println(p);
System.out.println(deploymentId +"|"+ processInstanceId +"|"+ workItemId);
RuntimeManager manager = RuntimeManagerRegistry.get().getManager(deploymentId);
if (manager != null) {
RuntimeEngine engine = manager.getRuntimeEngine(ProcessInstanceIdContext.get(processInstanceId));
engine.getKieSession().getWorkItemManager().completeWorkItem(workItemId, null);
manager.disposeRuntimeEngine(engine);
} else {
// in case there is no RuntimeManager available use available ksession,
// as it might be used without runtime manager at all
ksession.getWorkItemManager().completeWorkItem(workItemId, null);
}
}
}).start();
}
protected String nonNull(String value) {
if (value == null) {
return "";
}
return value;
}
}
Where am I wrong??