activiti脚本任务_Activiti中的高级脚本:自定义配置注入
activiti腳本任務
腳本任務可能是Activiti代碼庫中“最古老的”類之一,但是我認為它仍然未被許多人使用。 (感知到的)缺點當然是性能(解釋還是編譯),并且從IDE角度來看支持較少。
但是,好處(imo)超過了這一點:
- 腳本在流程xml本身中定義。 不再擔心版本控制和類路徑上的庫問題。
- 過去我們看到的是,技術水平較低的人敢于嘗試腳本。 但是從來沒有Java。
無論如何,很少有人知道或已經意識到,您可以在Activiti中的腳本中做得非常出色,并可以提高工作效率。 由于此類腳本是在流程引擎中執行的,因此您可以訪問該引擎的所有功能。 是的...一切...這使其既非常強大,又(潛在)危險(如果您不知道自己在做什么)。
讓我為您講解這樣的例子。 我喜歡將其稱為“自定義配置注入”概念 ,因為它有效地允許您在運行時添加自定義邏輯,從而顯著改變流程的執行。 如果您的名字更酷,請告訴我。
所有代碼都可以在我的Github頁面上找到: https : //github.com/jbarrez/activiti-advanced-scripting
用例
現在我想做什么。 好吧,我想有一個流程,執行時
- 向執行的每個用戶任務添加“任務完成事件處理程序”
- 此事件處理程序必須向遠程URL觸發自定義事件,在該URL上可能有事件處理器正在執行其工作
因此,基本上,我們希望每當任務完成時就將自定義事件觸發到某個遠程URL。 一個很好的用例是商業智能報告/復雜事件處理,例如使用Esper之類的東西。
第一個版本
可以在https://github.com/jbarrez/activit-advanced-scripting/blob/master/src/test/resources/org/activiti/test/my-process.bpmn20.xml中找到該功能的第一版 。 執行此過程時,將發生以下情況:
var config = Context.getProcessEngineConfiguration(); var bpmnParser = config.getBpmnParser();我們只需獲取當前的ProcessEngineConfiguration實例。 我們將從此配置中獲取BpmnParser實例,因為我們想更改整個引擎的常規用戶任務解析。
接下來,我們構建腳本:
var script = ""; script = script + "importPackage(java.net);"; script = script + "importPackage(java.io);"; script = script + "var url = new URL('http://localhost:8182/echo');"; script = script + "var connection = url.openConnection();"; script = script + "connection.setRequestMethod('POST');"; script = script + "connection.setDoOutput(true);"; script = script + "var outputStream = new BufferedOutputStream(connection.getOutputStream());"; script = script + "outputStream.write(new java.lang.String(\"{'eventType':'task-complete'}\").bytes);"; script = script + "outputStream.flush();"; script = script + "connection.connect();"; script = script + "var respCode = connection.getResponseCode();"; script = script + "if (respCode != 200) "; script = script + "println('Response code : ' + respCode);"; script = script + "outputStream.close();"; script = script + "connection.disconnect();";顯然,這不是執行此操作的最有效方法,但可以肯定地說明發生了什么。 消息'eventType:task-complete'通過標準java.net和java.io類發送到localhost:8182 url。
接下來是棘手的部分:
var handler = new ExecuteScriptOnTaskCompleteBpmnParseHandler("JavaScript"); handler.setUserTaskCompleteScript(script); bpmnParser.getBpmnParserHandlers().addHandler(handler);// reset the deployment cache such that the new listener gets picked up on a new redeploy config.getProcessDefinitionCache().clear();在這里,我們將BpmnParseHandler類添加到引擎配置中。 解析處理程序會將上面定義的腳本的執行添加到引擎發出的“任務完成事件”的每次接收中。 每次對用戶任務進行解析時,該解析處理程序都會啟動,從而有效地將我們的“將事件發送到遠程服務”添加到您的Activiti環境中現在發生的每個用戶任務中!
有一個單元測試以了解其工作原理: https : //github.com/jbarrez/activiti-advanced-scripting/blob/master/src/test/java/org/activiti/test/ExecuteScriptInProcessTest.java 。 在測試中,我們設置了一個非常簡單的“回顯服務”,只要接收到這樣的事件,它就會簡單地打印出來。 如果在IDE中運行它,將會看到類似以下內容:
但是我們可以做得更好
但是我們可以做得更好。 檢查以下代碼。
var handler = new ExecuteScriptOnTaskCompleteBpmnParseHandler("JavaScript"); handler.setUserTaskCompleteScript("http://localhost:8182/scripts/task-complete.js"); handler.setExecuteScriptInJob(true); bpmnParser.getBpmnParserHandlers().addHandler(handler);// Update the configuration to use the correct job handler var jobHandler = new ExecuteScriptJobHandler(); config.getJobHandlers().put(jobHandler.type,jobHandler);該代碼與上一節中的代碼相同。 為每個用戶任務附加一個“完成”事件的偵聽器。 但是,此實現:
- 異步執行腳本
- 沒有在流程xml中定義腳本,但是它是從遠程URL獲取的
- 更新作業處理程序配置
如果您問我,那太棒了! 因此,這意味著向遠程服務實際發送消息不會影響流程實例的執行性能 。 顯然,從這里您可以發瘋,添加持久隊列和所有奇特功能。 最重要的是,總是從遠程服務器獲取腳本。 如果要更新執行的邏輯,只需更改返回的腳本。 這意味著您可以在不影響實際流程的情況下影響運行時的流程執行。
在https://github.com/jbarrez/activiti-advanced-scripting/blob/master/src/test/java/org/activiti/test/ExecuteScriptWithJobTest.java有一個單元測試
如果運行此測試,則會看到以下內容。 請注意,我們在測試服務器上將完成腳本托管為名為“ task-complete.js”的靜態文件。
在測試中,您可以看到我們必須專門執行異步作業才能查看測試的輸出。
警告
需要注意的是:當流程引擎重新啟動時,將從配置文件中重新加載配置。 因此,不添加從上方插入自定義邏輯的過程。 但是,這可以通過使用ProcessEngineLifeCycleListener實現輕松完成,該實現在引擎啟動后執行特定類別的流程定義。 例如,如果將所有這些進程的“ config-processes”都設為類別,則可以在啟動時輕松執行它們。
結論
BPMN 2.0流程中的腳本編寫是一項非常強大的功能。 它使您可以在幾行之內更改整個引擎的流程執行。 當然,以上所有代碼都可以使用Java完成。 但是以上示例僅使用標準BPMN 2.0和每次JDK安裝中捆綁的javascript引擎。
謝謝閱讀。 編碼愉快!
翻譯自: https://www.javacodegeeks.com/2013/07/advanced-scripting-in-activiti-custom-configuration-injection.html
activiti腳本任務
總結
以上是生活随笔為你收集整理的activiti脚本任务_Activiti中的高级脚本:自定义配置注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 女儿国遇难50字概括 女儿国遇难50字概
- 下一篇: 力不暇供的意思 力不暇供出自哪