2015-09-09 104 views
0

我想在单独的线程中使用jBPM 6.2运行jBPM进程。因此,我创建了一个名为WorkflowThread的类,并在每次需要运行新进程时启动新的工作流线程。类的代码是这样的:jBPM - 在单独的线程中运行进程

public WorkflowThread(KieSession session, String workflowID, Map<String, Object> arguments) { 
    this.session = session; 
    this.workflowID = workflowID; 
    this.arguments = arguments; 
    this.workflowInstance = this.session.createProcessInstance(workflowID, arguments); 
} 

public void run(){ 
    if(this.workflowInstance.getState() == ProcessInstance.STATE_PENDING){ 
     this.session.startProcessInstance(this.workflowInstance.getId()); 
    }else{ 
     try { 
      throw new Exception("The process with id "+this.workflowInstance.getId()+" is not pending but in state "+this.workflowInstance.getState()); 
     } catch (Exception e) { 
      logger.error(e); 
      e.printStackTrace(); 
     } 
    } 

} 

调用代码:

WorkflowThread thread = new WorkflowThread(this.ksession, workflowID, arguments); 
thread.start(); 

然而,尽管我试图启动前检查过程中的状态(我检查它尚未开始),我得到一个异常:在线程“线程1” java.lang.IllegalArgumentException异常

例外:一个流程实例只能在org.jbpm.process.instance.impl一次 开始.ProcessInstanc eImpl.start(ProcessInstanceImpl.java:233) 在org.jbpm.workflow.instance.impl.WorkflowProcessInstanceImpl.start(WorkflowProcessInstanceImpl.java:389) 在org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java: 195) 在org.jbpm.process.instance.ProcessRuntimeImpl.startProcessInstance(ProcessRuntimeImpl.java:204) 在org.drools.core.impl.StatefulKnowledgeSessionImpl.startProcessInstance(StatefulKnowledgeSessionImpl.java:1911) 在welcome.auth.workflowmanager。 WorkflowThread.run(WorkflowThread.java:43)

我在做什么错?是否有可用于确保在单独的线程中执行工作流程的备选方案?

回答

0

假设jBPM sources你有状态不匹配。这看起来像一个种族条件。但是,我没有jBPM的经验,所以也许我错了。

+0

我认为你是完全正确的。我也看到了这个源代码。我再也看不到错误了。这意味着赛车状况。我会等待是否有更全面的答案,说明如何正确完成这项工作,如果没有,我会将您的答案标记为正确答案。非常感谢您的帮助。 –

相关问题