日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

activiti 变量_如何在Activiti中使用瞬态变量

發(fā)布時(shí)間:2023/12/3 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 activiti 变量_如何在Activiti中使用瞬态变量 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

activiti 變量

我們昨天發(fā)布的Activiti v6 Beta3中已經(jīng)加入了很多需要的功能-臨時(shí)變量。 在這篇文章中,我將向您展示一個(gè)示例,說(shuō)明如何使用瞬態(tài)變量來(lái)覆蓋一些以前不可能(或最佳)的高級(jí)用例。

到目前為止,Activiti中的所有變量都是持久的 。 這意味著將變量和值存儲(chǔ)在數(shù)據(jù)存儲(chǔ)中,并保留歷史審核數(shù)據(jù)。 另一方面,瞬態(tài)變量的行為和行為類似于常規(guī)變量,但它們不會(huì)持久存在。 除了不持久之外,以下是瞬態(tài)變量的特殊功能:

  • 當(dāng)流程實(shí)例的狀態(tài)持久保存到數(shù)據(jù)庫(kù)時(shí),臨時(shí)變量將一直保留到下一個(gè)“等待狀態(tài)”。
  • 瞬態(tài)變量屏蔽具有相同名稱的持久變量。

有關(guān)瞬時(shí)變量和API的更多詳細(xì)信息,請(qǐng)參見(jiàn)文檔 。

下面顯示了用于演示暫態(tài)變量的某些位的過(guò)程定義。 這是一個(gè)相當(dāng)簡(jiǎn)單的過(guò)程:想法是我們將向用戶詢問(wèn)諸如關(guān)鍵字和語(yǔ)言之類的東西,并使用它來(lái)進(jìn)行GitHub API調(diào)用。 如果成功,結(jié)果將顯示給用戶。 為此很容易編寫(xiě)一個(gè)UI(或使用Beta3 angularJS應(yīng)用程序中的新表單 ),但是在這篇文章中,我們將只關(guān)注代碼。

可以在以下Github存儲(chǔ)庫(kù)中找到BPMN 2.0 xml和代碼: https : //github.com/jbarrez/transient-vars-example

讓我們一起完成整個(gè)過(guò)程。 該過(guò)程首先從用戶提供一些有關(guān)應(yīng)搜索內(nèi)容的輸入開(kāi)始(通常這將使用開(kāi)始表格來(lái)完成)。

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

我們?cè)趩?dòng)流程實(shí)例時(shí)傳遞的變量是常規(guī)變量。 它們將被保留,并且將保留審核歷史記錄,因?yàn)闆](méi)有理由不應(yīng)該這樣做。

執(zhí)行的第一步是“執(zhí)行HTTP調(diào)用”步驟,這是帶有Java委托的服務(wù)任務(wù):

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

在這里,我們使用在流程實(shí)例啟動(dòng)時(shí)傳遞的'keyword'和'language'變量,針對(duì)GitHub API進(jìn)行了簡(jiǎn)單的HTTP獲取。 此處的特殊之處在于第16和17行,我們將響應(yīng)和響應(yīng)狀態(tài)存儲(chǔ)在瞬態(tài)變量中(這就是setTransientVariable()調(diào)用)。 選擇瞬態(tài)變量的原因是

  • Github API的json響應(yīng)非常大。 當(dāng)然,它可以以持久的方式存儲(chǔ),但這不會(huì)提高性能。
  • 從審計(jì)的角度來(lái)看,整個(gè)響應(yīng)的意義很小。 稍后,我們將從響應(yīng)中提取重要的位,并將這些位存儲(chǔ)在歷史數(shù)據(jù)中。

得到響應(yīng)并將其存儲(chǔ)在瞬態(tài)變量中之后,我們通過(guò)排它網(wǎng)關(guān)。 序列流如下所示:

<sequenceFlow ... ><extensionElements><activiti:executionListener event="take" class="org.activiti.ProcessResponseExecutionListener"></activiti:executionListener></extensionElements><conditionExpression xsi:type="tFormalExpression"><![CDATA[${responseStatus == 200}]]></conditionExpression> </sequenceFlow>

請(qǐng)注意,對(duì)于順序流動(dòng)條件,使用瞬態(tài)或非瞬態(tài)變量沒(méi)有區(qū)別。 常規(guī)的getVariable還將返回帶有名稱(如果已設(shè)置)的瞬態(tài)變量(這是上述文檔中的陰影部分)。 當(dāng)只應(yīng)查詢瞬態(tài)變量集時(shí),也存在getTransientVariable 。 無(wú)論如何:對(duì)于條件:完全沒(méi)有區(qū)別。

您還可以看到序列流具有一個(gè)(在圖中隱藏的)執(zhí)行偵聽(tīng)器。 執(zhí)行監(jiān)聽(tīng)器將解析json響應(yīng),選擇相關(guān)位并將其存儲(chǔ)在瞬態(tài)數(shù)組列表中。 這很重要,因?yàn)槟鷮⒃诖a下方閱讀。

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

將列表存儲(chǔ)為瞬時(shí)變量的原因很重要。 如您在圖中所看到的,接下來(lái)是一個(gè)多實(shí)例子流程。 子流程通常需要一個(gè)集合變量來(lái)創(chuàng)建實(shí)例。 到目前為止,這是一個(gè)持久變量,采用Java序列化 ArrayList的形式。 我從來(lái)沒(méi)有喜歡過(guò)它(如果以前必須將委托表達(dá)與bean一起使用)。 這總是讓我有些困擾。 現(xiàn)在,arraylist是臨時(shí)的,不會(huì)存儲(chǔ)在數(shù)據(jù)存儲(chǔ)中:

<subProcess name="subProcess"><multiInstanceLoopCharacteristics isSequential="false" activiti:collection="searchResults" activiti:elementVariable="searchResult" />

請(qǐng)注意,上面的“ searchResult”變量將是一個(gè)持久變量。

請(qǐng)注意,在達(dá)到用戶任務(wù)并將狀態(tài)存儲(chǔ)在數(shù)據(jù)存儲(chǔ)中之前,瞬態(tài)變量將一直存在。 在啟動(dòng)流程實(shí)例時(shí)也可以傳遞瞬態(tài)變量(這在這里可以是一種選擇,但是我認(rèn)為存儲(chǔ)用戶輸入是您想要的審計(jì)數(shù)據(jù)內(nèi)容)。

例如,如果要像這樣運(yùn)行流程實(shí)例:

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個(gè)結(jié)果):

當(dāng)前任務(wù):查看結(jié)果https://github.com/Activiti/Activiti
當(dāng)前任務(wù):查看結(jié)果https://github.com/twitter/ambrose
當(dāng)前任務(wù):查看結(jié)果https://github.com/azkaban/azkaban 當(dāng)前任務(wù):查看結(jié)果https://github.com/romannurik/AndroidDesignPreview 當(dāng)前任務(wù):審查結(jié)果https://github.com/spring-projects/spring-xd

用戶現(xiàn)在可以查看每個(gè)結(jié)果的詳細(xì)信息并繼續(xù)該過(guò)程。

最后的話

您可以想象,瞬時(shí)變量有很多用例。 我知道對(duì)于很多人來(lái)說(shuō)這是一個(gè)重要的功能,所以我很高興現(xiàn)在它已經(jīng)面世了。 像往常一樣,當(dāng)然也歡迎您提供反饋和意見(jiàn)!

翻譯自: https://www.javacodegeeks.com/2016/09/use-transient-variables-activiti.html

activiti 變量

總結(jié)

以上是生活随笔為你收集整理的activiti 变量_如何在Activiti中使用瞬态变量的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。