2015-02-17 53 views
2

我以这个example JBPM webapp作为我的代码的基础开始。我做了足够的修改,以便使用JBPM6.1.0.Final在JBoss EAP 6.3中部署代码(我无法在WildFly 8.1或8.2中部署它)。我想修改webapp来实际执行一些自定义的基本人工任务交互。我创建了一个名为PurchaseRequest的POJO,并创建了类型为PurchaseRequest的名为request的流程变量。下面的代码是我如何启动该过程什么是正确的方式来访问JBPM6过程变量

PurchaseRequest purchaseRequest = new PurchaseRequest(item, user, cost); 
Map<String, Object> params = new HashMap<String, Object>(); 
params.put("request", purchaseRequest); 
processInstanceId = processService.startProcess(processId, params); 

我添加了以下脚本任务以显示正在设置过程变量。

if (request == null) { 
    System.out.println("Output1: request is NULL"); 
} else { 
    System.out.println("Output1: request is VALID"); 
    System.out.println("\trequester: "+request.getRequester()); 
    System.out.println("\titem: "+request.getItem()); 
    System.out.println("\tcost: "+request.getCost()); 
} 

的TaskServlet里面添加以下实例变量

@Inject 
@Singleton 
private RuntimeEnvironment runtimeEnvironment; 

我还增加了以下私有方法给servlet

private void printTaskInfo(TaskSummary summary) { 
    RuntimeEngine runtime = processService.getRuntimeManager().getRuntimeEngine(EmptyContext 
      .get()); 
    KieSession ksession = runtime.getKieSession(); 
    ProcessInstance pi = ksession.getProcessInstance(summary.getProcessInstanceId()); 
    //Exception is occuring on this line 
    org.kie.api.definition.process.Process procsess = pi.getProcess(); 
} 

当我取回通过taskService活动任务。 retrieveTaskList(user)方法,我循环访问TaskSummary实例的集合并调用上面的私有方法。当我调用该方法,我得到以下错误

java.lang.RuntimeException: Process instance 1[com.sample.bpmn] is disconnected. 

我觉得我可能已经偏离偏离目标,因为我无法找到如何访问过程变量的任何实例。任何人都可以向我指出一个如何从Java EE/CDI容器中正确访问过程变量的例子吗?

编辑: 这是我为JBPM 6.1提出的代码。

public Object getProcessVariable(Long processInstanceId, String variable) { 
    RuntimeEngine runtime = singletonManager.getRuntimeEngine(EmptyContext.get()); 
    KieSession ksession = runtime.getKieSession(); 
    ProcessInstance pi = ksession.getProcessInstance(processInstanceId); 
    RuleFlowProcessInstance rfpi = (RuleFlowProcessInstance)pi; 
    if (rfpi == null) { 
     return null; 
    } 
    return rfpi.getVariable(variable); 
} 
+0

我会说这是现在最正确的做法:WorkflowProcessInstance wpi =(WorkflowProcessInstance)processInstance; 并且你应该在铸造之前检查pi变量是否为空 – salaboy 2015-09-28 08:29:47

回答

2

请注意,您正在访问此处的流程定义,您是否真的需要这样做?如果您已经知道您定义的流程变量,则可以仅从ProcessInstance中获取流程变量。

+1

谢谢你指出@salaboy。我忘记了ProcessInstance是一个接口而不是类。实现类实际上是RuleFlowProcessInstance,它包含方法public String getVariable(String variableName); – Mike 2015-02-18 13:20:50

+1

很高兴知道,我仍然可以在这里帮忙:)享受! – salaboy 2015-02-19 20:08:16

+1

@Mike,你能否提供一个关于如何访问流程实例变量的更新示例?我仍然不确定/困惑上面的解释。我也越来越'断线'错误。 – 2015-09-11 15:08:30

相关问题