2017-08-08 13 views
1

私は最新のAcitiviti 5.22.0エンジンを使用しています(具体的にはAlfresco Process Services 1.6.3を使用しています)、JSON表現を生成するために10分ごとに実行されるSpring Beanを実装しましたすべての自分のプロセス(プロセス名、開始日、終了日、現在のタスク名と担当者)を監査サーバーに送信します。問題は、最後に実行してから変更されたすべてのプロセスを送信するだけで済むということです。Activiti BPMNエンジン:データベースにカスタムプロパティを格納

プロセスが変更されるとすぐにJSONを送信するのではなく、監査システムのバッチ更新を10分ごとに実行したいと考えています。

これを達成するために、私はさまざまなアプローチを試みました。私の最新の1:

  1. ...イベントがトリガされるたびに、すべてのPROCESS_STARTED、PROCESS_COMPLETED、PROCESS_CANCELLED、TASK_COMPLETED、に耳を傾けイベントリスナBeanを作成したプロセス変数「_dirty」を記憶し、それを設定しますtrue to
  2. 「_dirty」変数がtrueに設定されているすべてのプロセスに対して、10分ごとにクエリが実行されます。
  3. JSONを監査システムに送信した後、すべての "_dirty"プロセス変数を偽です。

このアプローチの問題:プロセスが終了した後、 "_dirty"変数を更新できません。少なくとも私は方法を知らない。

私の2番目のアプローチは、すべてのイベントにprocessInstanceIdを「グローバル」プロパティに格納することですが、サーバーが再起動した場合にこの「グローバル」プロパティをデータベースに格納する方法はわかりません。余分なテーブルやDAOなどを作成せずに、プロパティやエンティティをDBに保持する方法はありますか?

どのようにこのタスクを解決するためのアイデアですか?すべてのヒントは非常に高く評価されています!

答えて

0

Linusが提案したように:これは不可能なので、私は完全に異なるアプローチが必要でした。

私は現在、Ad-Hocタスクを作成しており、自分のプロパティをローカルタスク変数として保存しています。 Ad-Hocタスクはシステムアカウントによって所有され、誰にも割り当てられません。こうすることで、私の本当のユーザーの誰もタスクを「完了」しようとすることはありません。また、必要に応じてタスクを生成するためのコードをいくつか作成しました。そのため、データを消去したい場合は、次にデータを保存するときに自動的に作成されます。

私のクラスにautowiringするorg.activiti.engine.TaskServiceを使用すると、Ad-Hocタスクを簡単に作成できます。

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

:このようなタスクのための

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

またはクエリ:

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を使用することができます非常に良い解決策ではありません(私はBeanや何かにキャッシュされたタスクを持っていることを推奨しますので、いつもそれを照会したり、値やキャッシュをキャッシュする必要はありません)。