2016-11-22 11 views
0

私は、サービスタスクだけで構成されるActivitiで実行されているポーレットを持っています。ポルセは長時間走っていて、途中で中止したいと思っています。プロセスがactiviti forumからactiviti - 実行中のプロセスインスタンスを終了する

ProcessInstance pi = runtimeService.startProcessInstanceById(
       processDefinitionId, executionParameters); 

を使用して開始され、プロセスがruntimeService

void deleteProcessInstance(String processInstanceId, String deleteReason); 

を呼び出すことによって終了させることができます。

startProcessInstanceByIdメソッドは、実行が終了した後にのみ返されるという問題があります。プロセスが終了していない限り、私はprocessInstanceを取得しません。

しかし、私はコードをデバッグして、メソッドの実装でprocessInstanceIdを見つけることができました。

他のスレッドからruntimeService.deleteProcessInstance(processInstanceId, deleteReason)メソッドを呼び出すと、指定されたprocessInstanceIdが存在しないことを示すActivitiObjectNotFoundExceptionが得られます。

さらに、processInstanceが実行されているときに、プロセスが実行中であっても、runtimeService.createProcessInstanceQuery().list()を呼び出すと空白のリストが返されます。

答えて

2
void deleteProcessInstance(String processInstanceId, String deleteReason); 

は、トランザクションがコミットされた場合にのみ存在するprocessInstanceIdを使用します。 私は現在のプロセスのインスタンスを実行して削除することが可能であるかどうかをテストしていないが、私はそこに例外のいくつかの種類を期待(transactions in activitiを参照してください)あなたのケースでは

を(実行中のプロセス・インスタンスが削除の実行を参照している)、私はフラグを追加しますプロセスを終了する必要があるかどうかを示す。このフラグは、例えばプロセスインスタンス実行中のリスナープロセスモデルを乱雑にしたくない場合は、リスナーをモデルに自動的に追加できます(Hooking into process parsing参照)。

+0

ここに正しい答えがあります。パース・ハンドラーを使用して、アクティビティー境界でインスタンスを終了する(完了イベントまたは作成イベントのいずれかで)リスナーを各サービス・タスクに自動的に追加します。 REST APIまたは標準のJavaプロセスインスタンスを使用してコールを終了または削除することはできません。実際には「ストレートスルー」プロセスでデータベースにアクセスしたことはありません。 –

1

プロセスは、実行ごとに非同期ポイントに達するとデータベースにコミットされます。他のスレッドでは、その前にプロセスが表示されません。

プロセスを明らかにする最も簡単な方法は、その最初のステップを非同期にすることです。このようにしてスレッドを呼び出すと、プロセスが作成されるとすぐに制御が戻されます。この場合、jobexecutorは非同期ポイントから処理を続行します(Web要求コンテキストは失われます。必要な場合は、プロセス変数などとして処理するために渡す必要があります)。プロセスの結果をすぐに戻したい場合は、結果をポーリングするか、この場合は他の同期機構を使用する必要があります。

私はこの場合deleteProcessが実際にプロセスを常に削除するかどうかはわかりませんが、db locking例外が発生する可能性があります。しかし、おそらくあなたのプロセスを即座にキャンセルするであろうsignalCatchingEventを中断して、サブプロセス内のすべての作業を行うことができます。

関連する問題