2016-07-19 71 views
0

Ich habe einen einfachen BPMN Prozess Sample.bpmn , in dem ich zwei Service-Task verwenden, ich bin Ausführung meines Prozesses unter Verwendung processEngine.getRuntimeService() startProcessInstanceByKey ("Process_1", Variablen). wo meine Variablen wie folgt:Prozessvariablen in Camunda-BPM

Map variables = new HashMap(); 
variables.put("a", 2); 
variables.put("b", 5); 

Mein erster Service-Task Zusatz Java-Klasse und mein zweiten Service-Task-Klasse implementiert Multiplikation implementiert.

Jetzt möchte ich 3 Variablen (Konstanten) "c", "d" und "e" haben, so dass c = 5, d = 10, e = 2, so dass ich meine "c" Variable verwenden kann für Service-Aufgabe 1, so dass Klasse I diese Variable verwenden kann, möchte ich auch Variable "d" in meiner Multiplikationsklasse verwenden und Variable "e" möchte ich global definieren, so dass ich dies in beiden Klassen verwenden kann.

Kann mir jemand dabei helfen?

Antwort

3

Als schnelle Lösung können Sie eine Setup-Service-Aufgabe als erste Aufgabe des Prozesses hinzufügen, der Ihre Prozessvariablen vorfüllt. Je nachdem, wie Sie einen Prozess starten können Sie entweder: Stellen Sie die Variablen über den Java-Objekt-api

https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/#java-object-api

oder Sie, wenn Sie verwenden, um einen REST Anruf können Sie diese festen Werte innerhalb der Anforderung Körper liefern :

https://docs.camunda.org/manual/7.5/reference/rest/process-definition/post-start-process-instance/

eine weitere einfache Lösung wäre eine Klasse mit statischen Werten oder einer enum sein, die benötigten Werte zu halten.

--edit--

wenn Sie verwenden möchten, die Eingangs-Ausgangs-Erweiterung hinzufügen, so etwas zu BPMN-Datei: kann

<bpmn:process id="Process_1" isExecutable="false"> 
    <bpmn:extensionElements> 
    <camunda:inputOutput> 
     <camunda:inputParameter name="c">5</camunda:inputParameter> 
     <camunda:inputParameter name="d">10</camunda:inputParameter> 
     <camunda:inputParameter name="e">2</camunda:inputParameter> 
    </camunda:inputOutput> 
    </bpmn:extensionElements> 

dies nicht in der Diagrammansicht des camunda erfolgen Modeller, wechseln Sie einfach zur XML-Darstellung des Prozesses und fügen Sie das extensionElement hinzu.

+0

Dank beharrte werden für Ihre information.i teilen dachte über einige Ausführung Hörer Anbringen mit Diese Serviceaufgaben können wir mit dem Execution Listner erledigen? Eine weitere Sache, die ich fragen möchte, ist, dass wir einige Ein-/Ausgaben und Eigenschaften in camunda modeler haben, was nutzt das und wie benutzt man sie? –

+0

Ich schätze wirklich Ihre Zeit und Mühe. Ich dachte über das Definieren dieser Variablen in meinem camunda Modellierer Im camunda Modellierer mit Serviceaufgabe können wir einige Input/Output anhängen und in Erweiterung können wir auch einige Eigenschaften haben .Meine Frage ist, können wir unsere Prozessvariablen dort definieren, wenn nicht dann, wo und wie können wir sie verwenden? –

1

Die Dokumentation zeigt zwei verschiedene Möglichkeiten, um den Wert zu speichern:

Java-Objekt api typisierten Wert api

Ich denke, mit Java-Objekt api das Java-Objekt erfordert serializable Schnittstelle zu implementieren? Der folgende Code brechen würde, wenn Order-Objekt nicht Serializable Schnittstelle implementieren

com.example.Order order = new com.example.Order(); 
runtimeService.setVariable(execution.getId(), "order", order); 

com.example.Order retrievedOrder = (com.example.Order) runtimeService.getVariable(execution.getId(), "order"); 

==

Ich würde das folgende Format für Java-Objekt verwendet

ObjectValue customerDataValue = Variables.objectValue(customerData) 
    .serializationDataFormat(Variables.SerializationDataFormats.JAVA) 
    .create(); 

execution.setVariable("someVariable", customerDataValue); 

Customer ein Java-Objekt verweisen. Wenn jedoch Membervariablen andere Referenzen enthalten, müssen diese Referenzen ebenfalls serialisiert werden.Um dies zu vermeiden werden Sie diese Verweise als vorübergehende

deklarieren Weiter mehr, verwenden setVariableLocal Methode, wenn Sie die Daten nicht wollen, in DB