2017-08-08 50 views
1

我使用最新的Acitiviti 5.22.0引擎(更具體地說我使用Alfresco Process Services 1.6.3),並且我實現了一個Spring bean,每10分鐘執行一次,以生成JSON表示我的所有流程(流程名稱,startDate,endDate,當前任務名稱和受理人)將其發送到審計服務器。問題是,我只需要發送自上次運行以來所有已更改的進程。Activiti BPMN引擎:在數據庫中存儲定製屬性

我並不想盡快發送JSON作爲一個過程的變化,但做到每10分鐘我的審覈系統的批量更新。

要做到這一點,我已經嘗試過不同的方法。我最近的一個:

  1. 創建一個事件監聽器bean偵聽所有PROCESS_STARTED,PROCESS_COMPLETED,PROCESS_CANCELLED,TASK_COMPLETED,...
  2. 每次被觸發的情況下,存儲過程變量「_dirty」,並將其設置爲真
  3. 將「_dirty」變量設置爲true的所有進程每隔10分鐘(執行我的JSON- bean執行)查詢
  4. 將JSON發送到審計系統後,將所有「_dirty」進程變量設置爲假。

該方法存在的問題:在進程結束後,我無法更新「_dirty」變量。至少我不知道如何。

我的第二種方法是將每個事件的processInstanceId存儲到「全局」屬性中,但我不知道如何在服務器重新啓動時將此「全局」屬性存儲到數據庫中。有沒有辦法在不創建額外的表,DAO等的情況下將屬性或實體持久化到DB中?

就如何解決這一任務的任何想法?所有提示都非常感謝!

回答

0

正如萊納斯所說:這是不可能的,所以我需要一些完全不同的方法。

我現在建立一個特設的任務,我的屬性存儲爲本地任務變量。 Ad-Hoc任務由系統帳戶擁有,並未分配給任何人。通過這種方式,我可以確定,我的真實用戶中沒有一個試圖「完成」任務。此外,如果需要,我還寫了一些代碼來生成任務,所以如果我想清除它,它會在下一次我想要存儲數據時自動創建。

創建即席任務是利用自動裝配org.activiti.engine.TaskService到我的類很容易。

Task task = taskService.newTask(); 
task.setDelegationState(DelegationState.PENDING); 
task.setName("Some name goes here"); 
task.setTenantId("your tenant id (if any)"); 
task.setOwner("your system accounts ID"); 
task.setCategory("i use a special category to later query for the task"); 
taskService.saveTask(task); 

任務保存到數據庫後,我可以使用taskService存儲和檢索變量是這樣的:

taskService.setVariableLocal(task.getId(), "variableKey", "variableValue"); 

或查詢這樣的任務:

Task task = taskService.createTaskQuery().taskDelegationState(DelegationState.PENDING).taskCategory("your special category").singleResult(); 

不是一個很好的解決方案(我建議將任務緩存在一個bean或其他東西中,這樣你就不需要一直查詢它,甚至不需要緩存它的值),但它是有效的。

相關問題