2015-02-17 51 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

相關問題