2015-04-01 39 views
2

有沒有辦法通過JBPM 6中的代碼來獲取和設置全局/本地變量列表?如何獲取和設置JBPM 6中的進程的局部變量列表?

我看到了JBPM 3版本的文檔象下面這樣:

ProcessInstance processInstance = ...; 
ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class); 

但這似乎過時了,並給了我一個錯誤。

此外,我還可以用

kcontext.setVariable("isApproved", false); 

設置通過BPMN編輯器中的變量,但我不太知道怎麼做的代碼檢索此kcontext變量。我通過了一個KieSession對象和一個ProcessInstance對象的getter方法,但沒有運氣。

更新: 我可以通過它傳遞給ksession.startProcess(...)方法params地圖對象訪問這些局部變量。這是獲取/設置本地/全局變量列表的唯一方法嗎?

謝謝!

+0

請考慮以下示例 - https://developer.jboss.org/people/bpmn2user/blog/2011/02/21/jbpm5-example-for-forms-with-variables 此處地圖正在設置中kContext而不是個別值。 – 2015-04-01 20:10:35

回答

3

下面是我一直訪問我的過程變量

String variableName = "Your_Variable_Name_here"; 
KieSession ksession = runtime.getKieSession(); 
ProcessInstance pi = ksession.getProcessInstance(processInstanceId); 
RuleFlowProcessInstance rfpi = (RuleFlowProcessInstance)pi; 
Object variable = rfpi.getVariable(variableName); 

然後,你應該投你的變量到適當的類。

+0

謝謝邁克。您的解決方案適用於我的情況。我只有一個問題。 'rfpi'對象通過'getVariable(variableName)'方法獲取變量的方式與'kcontext.getVariable(variableName)'獲取變量的方式相同嗎? – 2015-05-12 19:48:41

+0

此外,這是一種很好的jBPM實踐,從jBPM 6開發的角度來獲取和設置局部變量? – 2015-05-12 19:53:35

+1

因此,我發佈了它,它看起來像JBPM 6.2正式發佈。如果使用org.jbpm.services.api.ProcessService有以下方法:void setProcessVariable(Long processInstanceId,String variableId,Object value)和Object getProcessInstanceVariable(Long processInstanceId,String variableName)。如果您正在使用CDI,則可以通過以下注釋將其直接注入到容器管理器類中:@Inject ProcessService processService; – Mike 2015-05-13 12:29:44

2

this thread,您可以訪問過程實例變量在KieSession執行這個命令:

Map<String, Object> variables = ksession.execute(new GenericCommand<Map<String, Object>>() { 

      public Map<String, Object> execute(Context context) { 
       StatefulKnowledgeSession ksession = ((KnowledgeCommandContext) context).getStatefulKnowledgesession(); 
       ProcessInstance processInstance = (ProcessInstance) ksession.getProcessInstance(piId); 
       VariableScopeInstance variableScope = (VariableScopeInstance) processInstance.getContextInstance(VariableScope.VARIABLE_SCOPE); 
       Map<String, Object> variables = variableScope.getVariables(); 
       return variables; 
      } 
     }); 

如果你只是想獲得一個給定的過程變量:

WorkflowProcessInstance p = (WorkflowProcessInstance)ksession.startProcess("the.process"); 
p.getVariable("the_process_variable") 

要獲得所有全局使用ksession.getGlobals()