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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

activiti脚本任务_Activiti中的高级脚本:自定义配置注入

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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引擎。

謝謝閱讀。 編碼愉快!

參考: Activiti中的高級腳本: JCG合作伙伴 Joram Barrez在小腳步博客上的自定義配置注入 。

翻譯自: https://www.javacodegeeks.com/2013/07/advanced-scripting-in-activiti-custom-configuration-injection.html

activiti腳本任務

總結

以上是生活随笔為你收集整理的activiti脚本任务_Activiti中的高级脚本:自定义配置注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。