activiti 变量_如何在Activiti中使用瞬态变量
activiti 變量
我們昨天發布的Activiti v6 Beta3中已經加入了很多需要的功能-臨時變量。 在這篇文章中,我將向您展示一個示例,說明如何使用瞬態變量來覆蓋一些以前不可能(或最佳)的高級用例。
到目前為止,Activiti中的所有變量都是持久的 。 這意味著將變量和值存儲在數據存儲中,并保留歷史審核數據。 另一方面,瞬態變量的行為和行為類似于常規變量,但它們不會持久存在。 除了不持久之外,以下是瞬態變量的特殊功能:
- 當流程實例的狀態持久保存到數據庫時,臨時變量將一直保留到下一個“等待狀態”。
- 瞬態變量屏蔽具有相同名稱的持久變量。
有關瞬時變量和API的更多詳細信息,請參見文檔 。
例
下面顯示了用于演示暫態變量的某些位的過程定義。 這是一個相當簡單的過程:想法是我們將向用戶詢問諸如關鍵字和語言之類的東西,并使用它來進行GitHub API調用。 如果成功,結果將顯示給用戶。 為此很容易編寫一個UI(或使用Beta3 angularJS應用程序中的新表單 ),但是在這篇文章中,我們將只關注代碼。
可以在以下Github存儲庫中找到BPMN 2.0 xml和代碼: https : //github.com/jbarrez/transient-vars-example
讓我們一起完成整個過程。 該過程首先從用戶提供一些有關應搜索內容的輸入開始(通常這將使用開始表格來完成)。
repositoryService.createDeployment().addClasspathResource("process.bpmn20.xml").deploy();Map<String, Object> variables = new HashMap<String, Object>(); variables.put("keyWord", "workflow"); variables.put("language", "java"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("githubsearch", variables);我們在啟動流程實例時傳遞的變量是常規變量。 它們將被保留,并且將保留審核歷史記錄,因為沒有理由不應該這樣做。
執行的第一步是“執行HTTP調用”步驟,這是帶有Java委托的服務任務:
<serviceTask name="Execute HTTP call" activiti:class="org.activiti.ExecuteHttpCallDelegate"></serviceTask>Java代碼:
public class ExecuteHttpCallDelegate implements JavaDelegate {public void execute(DelegateExecution execution) {String keyword = (String) execution.getVariable("keyWord");String language = (String) execution.getVariable("language");String url = "https://api.github.com/search/repositories?q=%s+language:%s&sort=stars?=desc";url = String.format(url, keyword, language);HttpGet httpget = new HttpGet(url);CloseableHttpClient httpclient = HttpClients.createDefault();try {CloseableHttpResponse response = httpclient.execute(httpget);execution.setTransientVariable("response", IOUtils.toString(response.getEntity().getContent(), "UTF-8"));execution.setTransientVariable("responseStatus", response.getStatusLine().getStatusCode());response.close();} catch (Exception e) {e.printStackTrace();}}}在這里,我們使用在流程實例啟動時傳遞的'keyword'和'language'變量,針對GitHub API進行了簡單的HTTP獲取。 此處的特殊之處在于第16和17行,我們將響應和響應狀態存儲在瞬態變量中(這就是setTransientVariable()調用)。 選擇瞬態變量的原因是
- Github API的json響應非常大。 當然,它可以以持久的方式存儲,但這不會提高性能。
- 從審計的角度來看,整個響應的意義很小。 稍后,我們將從響應中提取重要的位,并將這些位存儲在歷史數據中。
得到響應并將其存儲在瞬態變量中之后,我們通過排它網關。 序列流如下所示:
<sequenceFlow ... ><extensionElements><activiti:executionListener event="take" class="org.activiti.ProcessResponseExecutionListener"></activiti:executionListener></extensionElements><conditionExpression xsi:type="tFormalExpression"><![CDATA[${responseStatus == 200}]]></conditionExpression> </sequenceFlow>請注意,對于順序流動條件,使用瞬態或非瞬態變量沒有區別。 常規的getVariable還將返回帶有名稱(如果已設置)的瞬態變量(這是上述文檔中的陰影部分)。 當只應查詢瞬態變量集時,也存在getTransientVariable 。 無論如何:對于條件:完全沒有區別。
您還可以看到序列流具有一個(在圖中隱藏的)執行偵聽器。 執行監聽器將解析json響應,選擇相關位并將其存儲在瞬態數組列表中。 這很重要,因為您將在代碼下方閱讀。
public class ProcessResponseExecutionListener implements ExecutionListener {private ObjectMapper objectMapper = new ObjectMapper();public void notify(DelegateExecution execution) {List<String> searchResults = new ArrayList<String>();String response = (String) execution.getVariable("response");try {JsonNode jsonNode = objectMapper.readTree(response);JsonNode itemsNode = jsonNode.get("items");if (itemsNode != null && itemsNode.isArray()) {for (JsonNode itemNode : (ArrayNode) itemsNode) {String url = itemNode.get("html_url").asText();searchResults.add(url);}}} catch (IOException e) {e.printStackTrace();}execution.setTransientVariable("searchResults", searchResults);}}將列表存儲為瞬時變量的原因很重要。 如您在圖中所看到的,接下來是一個多實例子流程。 子流程通常需要一個集合變量來創建實例。 到目前為止,這是一個持久變量,采用Java序列化 ArrayList的形式。 我從來沒有喜歡過它(如果以前必須將委托表達與bean一起使用)。 這總是讓我有些困擾。 現在,arraylist是臨時的,不會存儲在數據存儲中:
<subProcess name="subProcess"><multiInstanceLoopCharacteristics isSequential="false" activiti:collection="searchResults" activiti:elementVariable="searchResult" />請注意,上面的“ searchResult”變量將是一個持久變量。
請注意,在達到用戶任務并將狀態存儲在數據存儲中之前,瞬態變量將一直存在。 在啟動流程實例時也可以傳遞瞬態變量(這在這里可以是一種選擇,但是我認為存儲用戶輸入是您想要的審計數據內容)。
例如,如果要像這樣運行流程實例:
Map<String, Object> variables = new HashMap<String, Object>(); variables.put("keyWord", "workflow"); variables.put("language", "java"); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("githubsearch", variables);List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list(); for (Task task : tasks) {System.out.println("Current task : " + task.getName()); }作為示例輸出(限于5個結果):
當前任務:查看結果https://github.com/Activiti/Activiti
當前任務:查看結果https://github.com/twitter/ambrose
當前任務:查看結果https://github.com/azkaban/azkaban 當前任務:查看結果https://github.com/romannurik/AndroidDesignPreview 當前任務:審查結果https://github.com/spring-projects/spring-xd
…
用戶現在可以查看每個結果的詳細信息并繼續該過程。
最后的話
您可以想象,瞬時變量有很多用例。 我知道對于很多人來說這是一個重要的功能,所以我很高興現在它已經面世了。 像往常一樣,當然也歡迎您提供反饋和意見!
翻譯自: https://www.javacodegeeks.com/2016/09/use-transient-variables-activiti.html
activiti 變量
總結
以上是生活随笔為你收集整理的activiti 变量_如何在Activiti中使用瞬态变量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: input设置长度(input的长度设置
- 下一篇: wifi安全性怎么设置(怎么设置wifi