2017-01-30 10 views
4

Während des Datenimport-Tasks muss ich mehrere Camunda-Prozessinstanzen in einem "pausierten" oder suspendierten Zustand starten. Der Prozess hat einige Timer, und die Werte dieser Timer können in der Vergangenheit liegen. Wenn ich also einen solchen Prozess normal starte, wird die Ausführung einiger Aufgaben sofort gestartet, aber ich möchte diese Ausführung irgendwie verschieben (weil die Aufgaben einige Daten verwenden, die noch nicht importiert wurden). Also, ich möchte ein solches Verhalten:Starten des Camunda-Prozesses im gesperrten Zustand

1) irgendwie pausieren Sie die Camunda-Engine oder den Job-Executor oder die Prozessdefinition.

2) importieren alle erforderlichen Daten, und im gleichen Moment alle erforderlichen Prozesse

3) unpause die camunda beginnen, es zu lassen, zuvor gestartete Prozesse laufen und auszuführen.

Ich habe folgende Lösungen versucht:

1) global suspendieren die Prozessdefinition aus dem Cockpit. Aber wenn ich den Prozess beginne, wirft er die Exceptin, über die abhängige Prozessdefinition. I beginnen Prozess mit dem folgenden Code:

runtimeService.createProcessInstanceByKey("process-key") 
      .businessKey("some-business-key") 
      .setVariables(vars) 
      .startBeforeActivity("xxx") 
      .execute(); 

2) Prozess mit dem gleichen Code zu starten, und in den gleichen tx die Prozessinstanz runtimeService.suspendProcessInstanceById (processInstance.getProcessInstanceId()) auszusetzen; Aber ich bekomme einige Ausnahmen und Vorfälle.

3) Deaktivieren Sie den camunda-Job-Executor global in der Konfigurationsdatei. Funktioniert gut, aber nicht sehr praktisch, um die Konfiguration zu ändern und den Server jedes Mal neu zu starten.

Gibt es bessere Lösungen?

+0

Verwenden Sie eine gemeinsam genutzte oder eingebettete Engine? Wenn freigegeben, welcher Anwendungsserver? – thorben

+0

Camunda ist als Submodul von wildfly10 installiert. – NullPointer

Antwort

2

Es wurde eine Möglichkeit gefunden, den Job-Executor in Runtime zu steuern.

JobExecutor jobExecutor = ((ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration()).getJobExecutor(); 
    if (jobExecutor.isActive()) { 
     jobExecutor.shutdown(); 
    } else { 
     jobExecutor.start(); 
    } 
+0

Ich denke, das ist eine gute Lösung. Je nach Verwendung müssen Sie möglicherweise den Zugriff auf diesen Code synchronisieren. Auf anderen Servern als JBoss/Wildfly bietet Camunda MBeans zum Starten/Stoppen von Auftragsvollstreckern. – thorben

Verwandte Themen