访问 JBPM 流程变量的正确方法是什么

What is the proper way to acces JBPM6 Process Variables

我以此 example JBPM webapp 作为我代码的基础。我做了足够的修改,以使用 JBPM6.1.0.Final 将代码部署到 JBoss EAP 6.3(我无法将其部署到 WildFly 8.1 或 8.2)。我想修改 webapp 以实际执行一些自定义的基本人工任务交互。我创建了一个名为 PurchaseRequest 的 POJO,并创建了一个名为 request 的 PurchaseRequest 类型的流程变量。下面的代码是我如何开始这个过程

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);
}

请注意,您正在访问其中的流程定义,您真的需要这样做吗?如果您已经知道您定义的流程变量,您可以直接从 ProcessInstance 获取流程变量。