Package: process-engine
ProcessEngine mittels Python verwendenWenn es darum geht mit Python Prozess zu starten bzw. zu kontrollieren,External Taskzu verarbeiten
und Benutzer-Tasks auszuführen, dann ist derprocess_engine-Client richtig. In dieser README
wird die Verwendung der unterschiedliche Aspekte anhand von Beispielen gezeigt:Vorbereitung der UmgebungProzess startenExternal TaskverarbeitenTODO:User TaskbearbeitenTODO:Eventaus der Prozessengine verarbeitenTODO: Verweis auf API-Dokumentation hinzufügenDie Erweiterung der Client wird dagegen inCONTRIBUTION.MDerklärt.Vorbereitung der UmgebungInstallation desBPMN-StudioDie einfachster Version mit der Interaktion von Python und der ProzessEngine zu starten,
ist die Installation desBPMN-Studio, da es die Entwicklung von BPMN-Prozess unterstützt
und eine vorbereitete ProzessEngine mitbringt, die für die ersten Schritte ausreichend ist.Prozess erstellen bzw. Beispiel verwendenUm den ersten Prozess nicht erstellen zu müssen, ist der ProzessHello Worldvorhanden, dieser muss in dasBPMN-Studiogeladen werden.Prozess auf die ProzessEngine veröffentlichenUm den Prozess verwenden zu können, ist es notwendig, dass
dieser auf doe ProzessEngine veröffentlicht worden ist. Dazu ist es notwendig, den Prozess zu öffenen (1) und anschließend auf die ProzessEngine zu veröffentlichen (2).Nachdem der Prozess veröffenticht würde, kann er mittels Python gestartet werden.Prozess startenUm einen Prozess zu startet ist die Prozess-Id (hier:hello_world) und das Start-Event (hier:the_start_event) notwendig und die URL (hier:http://localhost:56000) unter der die ProzessEngine zu erreichen ist. Nachdem die Informationen bekannt sind, kann der Prozess mit dem entsprechenden angepasseten Script mit Hilfe von Python gestartet werden.Beispiel mit nicht blockierendem Clientimportloggingfromprocess_engine.process_controlimportProcessControlClientlogger=logging.getLogger(__name__)defmain(process_engine_url):client=ProcessControlClient(process_engine_url)result=client.start_process_instance('hello_world','the_start_event')logger.info(f"Started process instance with result{result}")if__name__=='__main__':current_process_engine='http://localhost:56000'format_template='%(asctime)s-%(name)s-%(levelname)s-%(message)s'level=logging.DEBUGlogging.basicConfig(level=level,format=format_template)main(current_process_engine)Beispiel mit blockierendem Clientimportloggingfromprocess_engine.process_controlimportProcessControlClient,StartCallbackTypelogger=logging.getLogger(__name__)defmain(process_engine_url):client=ProcessControlClient(process_engine_url)result=client.start_process_instance('hello_world','the_start_event','the_end_event',start_callback=StartCallbackType.ON_ENDEVENT_REACHED)logger.info(f"Started process instance with result{result}")if__name__=='__main__':current_process_engine='http://localhost:56000'format_template='%(asctime)s-%(name)s-%(levelname)s-%(message)s'level=logging.DEBUGlogging.basicConfig(level=level,format=format_template)main(current_process_engine)External TaskverarbeitenIm Beispiel-Prozess ist bereit eine ServiceTask alsExternal Taskkonfiguriert.Für die Verwendung desExternal Taskmuss ein Topic (hier:SampleExternalTask) festgelegt werden und die URL der ProzessEngine (hier:http://localhost:56000) bekannt sein.
Nachdem die Informationen bekannt sind, kann derExternal Taskmit dem angepassten Script abgearbeitet werden.Optionen für das Abonnieren von Aufträgen:max_tasks: Anzahl der Aufträge (task), die gleichzeitig verarbeitet werden sollenlong_polling_timeout: Timeout für das Abonnierenlock_duration: Wir lange soll der Auftrag reseviert werden, bis er für weitere Worker zur Verfügung stehtadditional_lock_duration: Wir lange soll eine Auftragsreservierung verlängert werden.extend_lock_timeout: ...Beispiel mit einem Parameter für den Handler_handlerimportloggingfromprocess_engine.external_taskimportExternalTaskClientlogger=logging.getLogger(__name__)def_handler(payload):logger.debug("so some work")logger.debug(payload)logger.debug("some worker done.")return{'some':'result'}defmain(process_engine_url):client=ExternalTaskClient(process_engine_url)client.subscribe_to_external_task_for_topic("SampleExternalTask",_handler,max_tasks=5)client.start()if__name__=='__main__':current_process_engine='http://localhost:56000'format_template='%(asctime)s-%(name)s-%(levelname)s-%(message)s'level=logging.INFO#logging.DEBUGlogging.basicConfig(level=level,format=format_template)main(current_process_engine)Beispiel mit einem weiteren Parameter für den Handler_handlerimportloggingfromprocess_engine.external_taskimportExternalTaskClientlogger=logging.getLogger(__name__)def_handler(payload,task):logger.debug("so some work")logger.info(f"payload:{payload}for task{task}")logger.debug("some worker done.")return{'some':'result'}defmain(process_engine_url):client=ExternalTaskClient(process_engine_url)client.subscribe_to_external_task_for_topic("SampleExternalTask",_handler)client.start()if__name__=='__main__':current_process_engine='http://localhost:56000'format_template='%(asctime)s-%(name)s-%(levelname)s-%(message)s'level=logging.INFO#logging.DEBUGlogging.basicConfig(level=level,format=format_template)main(current_process_engine)