From 0d012e76937f81043a67f3413dcb3b95960407a3 Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Wed, 10 May 2023 06:33:02 +0000 Subject: automatic import of python-camunda-external-task-client-python3 --- python-camunda-external-task-client-python3.spec | 772 +++++++++++++++++++++++ 1 file changed, 772 insertions(+) create mode 100644 python-camunda-external-task-client-python3.spec (limited to 'python-camunda-external-task-client-python3.spec') diff --git a/python-camunda-external-task-client-python3.spec b/python-camunda-external-task-client-python3.spec new file mode 100644 index 0000000..b19e14f --- /dev/null +++ b/python-camunda-external-task-client-python3.spec @@ -0,0 +1,772 @@ +%global _empty_manifest_terminate_build 0 +Name: python-camunda-external-task-client-python3 +Version: 4.3.0 +Release: 1 +Summary: Camunda External Task Client for Python 3 +License: Apache-2.0 +URL: https://github.com/yogeshrnaik/camunda-external-task-client-python3 +Source0: https://mirrors.nju.edu.cn/pypi/web/packages/9e/36/15da9f2d606c83bc148d9ceeab91fba2448be33d57e90eee27261ab5843a/camunda_external_task_client_python3-4.3.0.tar.gz +BuildArch: noarch + +Requires: python3-requests + +%description +[![Community Extension](https://img.shields.io/badge/Community%20Extension-An%20open%20source%20community%20maintained%20project-FF4700)](https://github.com/camunda-community-hub/community)[![Lifecycle: Stable](https://img.shields.io/badge/Lifecycle-Stable-brightgreen)](https://github.com/Camunda-Community-Hub/community/blob/main/extension-lifecycle.md#stable-) + +# camunda-external-task-client-python3 +![camunda-external-task-client-python3](https://github.com/trustfactors/camunda-external-task-client-python3/workflows/camunda-external-task-client-python3/badge.svg) + +This repository contains Camunda External Task Client written in Python3. + + +Implement your [BPMN Service Task](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/) in Python3. + +> Python >= 3.7 is required + +## Installing +Add following line to `requirements.txt` of your Python project. +``` +git+https://github.com/trustfactors/camunda-external-task-client-python3.git/#egg=camunda-external-task-client-python3 +``` + +Or use pip to install as shown below: +``` +pip install camunda-external-task-client-python3 +``` + +## Running Camunda with Docker +To run the examples provided in [examples](./examples) folder, you need to have Camunda running locally or somewhere. + +To run Camunda locally with Postgres DB as backend, you can use [docker-compose.yml](./docker-compose.yml) file. + +``` +$> docker-compose -f docker-compose.yml up +``` +### Auth Basic Examples + +To run the examples with Auth Basic provided in [examples/examples_auth_basic](./examples/examples_auth_basic) folder, you need to have Camunda with AuthBasic, running locally or somewhere. + +To run Camunda with AuthBasic locally with Postgres DB as backend, you can use [docker-compose-auth.yml](./docker-compose-auth.yml) file. + +``` +$> docker-compose -f docker-compose-auth.yml up +``` + +## Usage + +1. Make sure to have [Camunda](https://camunda.com/download/) running. +2. Create a simple process model with an External Service Task and define the topic as 'topicName'. +3. Deploy the process to the Camunda BPM engine. +4. In your Python code: + +```python +import time +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +# configuration for the Client +default_config = { + "maxTasks": 1, + "lockDuration": 10000, + "asyncResponseTimeout": 5000, + "retries": 3, + "retryTimeout": 5000, + "sleepSeconds": 30 +} + +def handle_task(task: ExternalTask) -> TaskResult: + """ + This task handler you need to implement with your business logic. + After completion of business logic call either task.complete() or task.failure() or task.bpmn_error() + to report status of task to Camunda + """ + # add your business logic here + # ... + + # mark task either complete/failure/bpmnError based on outcome of your business logic + failure, bpmn_error = random_true(), random_true() # this code simulate random failure + if failure: + # this marks task as failed in Camunda + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + elif bpmn_error: + return task.bpmn_error(error_code="BPMN_ERROR_CODE", error_message="BPMN Error occurred", + variables={"var1": "value1", "success": False}) + + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +def random_true(): + current_milli_time = int(round(time.time() * 1000)) + return current_milli_time % 2 == 0 + +if __name__ == '__main__': + ExternalTaskWorker(worker_id="1", config=default_config).subscribe("topicName", handle_task) +``` + +## About External Tasks + +External Tasks are service tasks whose execution differs particularly from the execution of other service tasks (e.g. Human Tasks). +The execution works in a way that units of work are polled from the engine before being completed. + +**camunda-external-task-client-python** allows you to create easily such client in Python3. + +## Features + +### [Start process](https://docs.camunda.org/manual/latest/reference/rest/process-definition/post-start-process-instance/) +Camunda provides functionality to start a process instance for a given process definition. + +To start a process instance, we can use `start_process()` from [engine_client.py](./camunda/client/engine_client.py#L24) + +You can find a usage example [here](./examples/start_process.py). + +```python +client = EngineClient() +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +### [Fetch and Lock](https://docs.camunda.org/manual/latest/reference/rest/external-task/fetch/) + +`ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task)` starts long polling of the Camunda engine for external tasks. + +* Polling tasks from the engine works by performing a fetch & lock operation of tasks that have subscriptions. It then calls the handler function passed to `subscribe()` function. i.e. `handle_task` in above example. +* Long Polling is done periodically based on the `asyncResponseTimeout` configuration. Read more about [Long Polling](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/#long-polling-to-fetch-and-lock-external-tasks). + +### [Complete](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-complete/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle Failure](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-failure/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle task Failure + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + # This client/worker uses max_retries if no retries are previously set in the task + # if retries are previously set then it just decrements that count by one before reporting failure to Camunda + # when retries are zero, Camunda creates an incident which then manually needs to be looked into on Camunda Cockpit + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle BPMN Error](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-bpmn-error/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle a BPMN Failure + return task.bpmn_error(error_code="BPMN_ERROR", error_message="BPMN error occurred") + +ExternalTaskWorker(worker_id="1" ).subscribe("topicName", handle_task) +``` + +### Access Process Variables +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + # get the process variable 'score' + score = task.get_variable("score") + if int(score) >= 100: + return task.complete(...) + else: + return task.failure(...) + +ExternalTaskWorker().subscribe("topicName", handle_task) +``` + +### [Correlate message](https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/) +Camunda provides functionality to send a message event to a running process instance. + +You can read more about the message events here: https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/ + +In our to send a message event to a process instance, a new function called `correlate_message()` is added to [engine_client.py](./camunda/client/engine_client.py#L60) + +We can correlate the message by: +- process_instance_id +- tenant_id +- business_key +- process_variables + +You can find a usage example [here](./examples/correlate_message.py). + +```python +client = EngineClient() +resp_json = client.correlate_message("CANCEL_MESSAGE", business_key="b4a6f392-12ab-11eb-80ef-acde48001122") +``` +## AuthBasic Usage + +To create an EngineClient with AuthBasic simple + +```python +client = EngineClient(config={"auth_basic": {"username": "demo", "password": "demo"}}) +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +To create an ExternalTaskWorker with AuthBasic simple + +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +config = {"auth_basic": {"username": "demo", "password": "demo"}} + +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1", config=config).subscribe("topicName", handle_task) +``` + +## License +The source files in this repository are made available under the [Apache License Version 2.0](./LICENSE). + + + + +%package -n python3-camunda-external-task-client-python3 +Summary: Camunda External Task Client for Python 3 +Provides: python-camunda-external-task-client-python3 +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-pip +%description -n python3-camunda-external-task-client-python3 +[![Community Extension](https://img.shields.io/badge/Community%20Extension-An%20open%20source%20community%20maintained%20project-FF4700)](https://github.com/camunda-community-hub/community)[![Lifecycle: Stable](https://img.shields.io/badge/Lifecycle-Stable-brightgreen)](https://github.com/Camunda-Community-Hub/community/blob/main/extension-lifecycle.md#stable-) + +# camunda-external-task-client-python3 +![camunda-external-task-client-python3](https://github.com/trustfactors/camunda-external-task-client-python3/workflows/camunda-external-task-client-python3/badge.svg) + +This repository contains Camunda External Task Client written in Python3. + + +Implement your [BPMN Service Task](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/) in Python3. + +> Python >= 3.7 is required + +## Installing +Add following line to `requirements.txt` of your Python project. +``` +git+https://github.com/trustfactors/camunda-external-task-client-python3.git/#egg=camunda-external-task-client-python3 +``` + +Or use pip to install as shown below: +``` +pip install camunda-external-task-client-python3 +``` + +## Running Camunda with Docker +To run the examples provided in [examples](./examples) folder, you need to have Camunda running locally or somewhere. + +To run Camunda locally with Postgres DB as backend, you can use [docker-compose.yml](./docker-compose.yml) file. + +``` +$> docker-compose -f docker-compose.yml up +``` +### Auth Basic Examples + +To run the examples with Auth Basic provided in [examples/examples_auth_basic](./examples/examples_auth_basic) folder, you need to have Camunda with AuthBasic, running locally or somewhere. + +To run Camunda with AuthBasic locally with Postgres DB as backend, you can use [docker-compose-auth.yml](./docker-compose-auth.yml) file. + +``` +$> docker-compose -f docker-compose-auth.yml up +``` + +## Usage + +1. Make sure to have [Camunda](https://camunda.com/download/) running. +2. Create a simple process model with an External Service Task and define the topic as 'topicName'. +3. Deploy the process to the Camunda BPM engine. +4. In your Python code: + +```python +import time +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +# configuration for the Client +default_config = { + "maxTasks": 1, + "lockDuration": 10000, + "asyncResponseTimeout": 5000, + "retries": 3, + "retryTimeout": 5000, + "sleepSeconds": 30 +} + +def handle_task(task: ExternalTask) -> TaskResult: + """ + This task handler you need to implement with your business logic. + After completion of business logic call either task.complete() or task.failure() or task.bpmn_error() + to report status of task to Camunda + """ + # add your business logic here + # ... + + # mark task either complete/failure/bpmnError based on outcome of your business logic + failure, bpmn_error = random_true(), random_true() # this code simulate random failure + if failure: + # this marks task as failed in Camunda + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + elif bpmn_error: + return task.bpmn_error(error_code="BPMN_ERROR_CODE", error_message="BPMN Error occurred", + variables={"var1": "value1", "success": False}) + + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +def random_true(): + current_milli_time = int(round(time.time() * 1000)) + return current_milli_time % 2 == 0 + +if __name__ == '__main__': + ExternalTaskWorker(worker_id="1", config=default_config).subscribe("topicName", handle_task) +``` + +## About External Tasks + +External Tasks are service tasks whose execution differs particularly from the execution of other service tasks (e.g. Human Tasks). +The execution works in a way that units of work are polled from the engine before being completed. + +**camunda-external-task-client-python** allows you to create easily such client in Python3. + +## Features + +### [Start process](https://docs.camunda.org/manual/latest/reference/rest/process-definition/post-start-process-instance/) +Camunda provides functionality to start a process instance for a given process definition. + +To start a process instance, we can use `start_process()` from [engine_client.py](./camunda/client/engine_client.py#L24) + +You can find a usage example [here](./examples/start_process.py). + +```python +client = EngineClient() +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +### [Fetch and Lock](https://docs.camunda.org/manual/latest/reference/rest/external-task/fetch/) + +`ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task)` starts long polling of the Camunda engine for external tasks. + +* Polling tasks from the engine works by performing a fetch & lock operation of tasks that have subscriptions. It then calls the handler function passed to `subscribe()` function. i.e. `handle_task` in above example. +* Long Polling is done periodically based on the `asyncResponseTimeout` configuration. Read more about [Long Polling](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/#long-polling-to-fetch-and-lock-external-tasks). + +### [Complete](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-complete/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle Failure](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-failure/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle task Failure + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + # This client/worker uses max_retries if no retries are previously set in the task + # if retries are previously set then it just decrements that count by one before reporting failure to Camunda + # when retries are zero, Camunda creates an incident which then manually needs to be looked into on Camunda Cockpit + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle BPMN Error](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-bpmn-error/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle a BPMN Failure + return task.bpmn_error(error_code="BPMN_ERROR", error_message="BPMN error occurred") + +ExternalTaskWorker(worker_id="1" ).subscribe("topicName", handle_task) +``` + +### Access Process Variables +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + # get the process variable 'score' + score = task.get_variable("score") + if int(score) >= 100: + return task.complete(...) + else: + return task.failure(...) + +ExternalTaskWorker().subscribe("topicName", handle_task) +``` + +### [Correlate message](https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/) +Camunda provides functionality to send a message event to a running process instance. + +You can read more about the message events here: https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/ + +In our to send a message event to a process instance, a new function called `correlate_message()` is added to [engine_client.py](./camunda/client/engine_client.py#L60) + +We can correlate the message by: +- process_instance_id +- tenant_id +- business_key +- process_variables + +You can find a usage example [here](./examples/correlate_message.py). + +```python +client = EngineClient() +resp_json = client.correlate_message("CANCEL_MESSAGE", business_key="b4a6f392-12ab-11eb-80ef-acde48001122") +``` +## AuthBasic Usage + +To create an EngineClient with AuthBasic simple + +```python +client = EngineClient(config={"auth_basic": {"username": "demo", "password": "demo"}}) +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +To create an ExternalTaskWorker with AuthBasic simple + +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +config = {"auth_basic": {"username": "demo", "password": "demo"}} + +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1", config=config).subscribe("topicName", handle_task) +``` + +## License +The source files in this repository are made available under the [Apache License Version 2.0](./LICENSE). + + + + +%package help +Summary: Development documents and examples for camunda-external-task-client-python3 +Provides: python3-camunda-external-task-client-python3-doc +%description help +[![Community Extension](https://img.shields.io/badge/Community%20Extension-An%20open%20source%20community%20maintained%20project-FF4700)](https://github.com/camunda-community-hub/community)[![Lifecycle: Stable](https://img.shields.io/badge/Lifecycle-Stable-brightgreen)](https://github.com/Camunda-Community-Hub/community/blob/main/extension-lifecycle.md#stable-) + +# camunda-external-task-client-python3 +![camunda-external-task-client-python3](https://github.com/trustfactors/camunda-external-task-client-python3/workflows/camunda-external-task-client-python3/badge.svg) + +This repository contains Camunda External Task Client written in Python3. + + +Implement your [BPMN Service Task](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/) in Python3. + +> Python >= 3.7 is required + +## Installing +Add following line to `requirements.txt` of your Python project. +``` +git+https://github.com/trustfactors/camunda-external-task-client-python3.git/#egg=camunda-external-task-client-python3 +``` + +Or use pip to install as shown below: +``` +pip install camunda-external-task-client-python3 +``` + +## Running Camunda with Docker +To run the examples provided in [examples](./examples) folder, you need to have Camunda running locally or somewhere. + +To run Camunda locally with Postgres DB as backend, you can use [docker-compose.yml](./docker-compose.yml) file. + +``` +$> docker-compose -f docker-compose.yml up +``` +### Auth Basic Examples + +To run the examples with Auth Basic provided in [examples/examples_auth_basic](./examples/examples_auth_basic) folder, you need to have Camunda with AuthBasic, running locally or somewhere. + +To run Camunda with AuthBasic locally with Postgres DB as backend, you can use [docker-compose-auth.yml](./docker-compose-auth.yml) file. + +``` +$> docker-compose -f docker-compose-auth.yml up +``` + +## Usage + +1. Make sure to have [Camunda](https://camunda.com/download/) running. +2. Create a simple process model with an External Service Task and define the topic as 'topicName'. +3. Deploy the process to the Camunda BPM engine. +4. In your Python code: + +```python +import time +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +# configuration for the Client +default_config = { + "maxTasks": 1, + "lockDuration": 10000, + "asyncResponseTimeout": 5000, + "retries": 3, + "retryTimeout": 5000, + "sleepSeconds": 30 +} + +def handle_task(task: ExternalTask) -> TaskResult: + """ + This task handler you need to implement with your business logic. + After completion of business logic call either task.complete() or task.failure() or task.bpmn_error() + to report status of task to Camunda + """ + # add your business logic here + # ... + + # mark task either complete/failure/bpmnError based on outcome of your business logic + failure, bpmn_error = random_true(), random_true() # this code simulate random failure + if failure: + # this marks task as failed in Camunda + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + elif bpmn_error: + return task.bpmn_error(error_code="BPMN_ERROR_CODE", error_message="BPMN Error occurred", + variables={"var1": "value1", "success": False}) + + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +def random_true(): + current_milli_time = int(round(time.time() * 1000)) + return current_milli_time % 2 == 0 + +if __name__ == '__main__': + ExternalTaskWorker(worker_id="1", config=default_config).subscribe("topicName", handle_task) +``` + +## About External Tasks + +External Tasks are service tasks whose execution differs particularly from the execution of other service tasks (e.g. Human Tasks). +The execution works in a way that units of work are polled from the engine before being completed. + +**camunda-external-task-client-python** allows you to create easily such client in Python3. + +## Features + +### [Start process](https://docs.camunda.org/manual/latest/reference/rest/process-definition/post-start-process-instance/) +Camunda provides functionality to start a process instance for a given process definition. + +To start a process instance, we can use `start_process()` from [engine_client.py](./camunda/client/engine_client.py#L24) + +You can find a usage example [here](./examples/start_process.py). + +```python +client = EngineClient() +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +### [Fetch and Lock](https://docs.camunda.org/manual/latest/reference/rest/external-task/fetch/) + +`ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task)` starts long polling of the Camunda engine for external tasks. + +* Polling tasks from the engine works by performing a fetch & lock operation of tasks that have subscriptions. It then calls the handler function passed to `subscribe()` function. i.e. `handle_task` in above example. +* Long Polling is done periodically based on the `asyncResponseTimeout` configuration. Read more about [Long Polling](https://docs.camunda.org/manual/latest/user-guide/process-engine/external-tasks/#long-polling-to-fetch-and-lock-external-tasks). + +### [Complete](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-complete/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle Failure](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-failure/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle task Failure + return task.failure(error_message="task failed", error_details="failed task details", + max_retries=3, retry_timeout=5000) + # This client/worker uses max_retries if no retries are previously set in the task + # if retries are previously set then it just decrements that count by one before reporting failure to Camunda + # when retries are zero, Camunda creates an incident which then manually needs to be looked into on Camunda Cockpit + +ExternalTaskWorker(worker_id="1").subscribe("topicName", handle_task) +``` + +### [Handle BPMN Error](https://docs.camunda.org/manual/latest/reference/rest/external-task/post-bpmn-error/) +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Handle a BPMN Failure + return task.bpmn_error(error_code="BPMN_ERROR", error_message="BPMN error occurred") + +ExternalTaskWorker(worker_id="1" ).subscribe("topicName", handle_task) +``` + +### Access Process Variables +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + # get the process variable 'score' + score = task.get_variable("score") + if int(score) >= 100: + return task.complete(...) + else: + return task.failure(...) + +ExternalTaskWorker().subscribe("topicName", handle_task) +``` + +### [Correlate message](https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/) +Camunda provides functionality to send a message event to a running process instance. + +You can read more about the message events here: https://docs.camunda.org/manual/7.13/reference/bpmn20/events/message-events/ + +In our to send a message event to a process instance, a new function called `correlate_message()` is added to [engine_client.py](./camunda/client/engine_client.py#L60) + +We can correlate the message by: +- process_instance_id +- tenant_id +- business_key +- process_variables + +You can find a usage example [here](./examples/correlate_message.py). + +```python +client = EngineClient() +resp_json = client.correlate_message("CANCEL_MESSAGE", business_key="b4a6f392-12ab-11eb-80ef-acde48001122") +``` +## AuthBasic Usage + +To create an EngineClient with AuthBasic simple + +```python +client = EngineClient(config={"auth_basic": {"username": "demo", "password": "demo"}}) +resp_json = client.start_process(process_key="PARALLEL_STEPS_EXAMPLE", variables={"intVar": "1", "strVar": "hello"}, + tenant_id="6172cdf0-7b32-4460-9da0-ded5107aa977", business_key=str(uuid.uuid1())) +``` + +To create an ExternalTaskWorker with AuthBasic simple + +```python +from camunda.external_task.external_task import ExternalTask, TaskResult +from camunda.external_task.external_task_worker import ExternalTaskWorker + +config = {"auth_basic": {"username": "demo", "password": "demo"}} + +def handle_task(task: ExternalTask) -> TaskResult: + # add your business logic here + + # Complete the task + # pass any output variables you may want to send to Camunda as dictionary to complete() + return task.complete({"var1": 1, "var2": "value"}) + +ExternalTaskWorker(worker_id="1", config=config).subscribe("topicName", handle_task) +``` + +## License +The source files in this repository are made available under the [Apache License Version 2.0](./LICENSE). + + + + +%prep +%autosetup -n camunda-external-task-client-python3-4.3.0 + +%build +%py3_build + +%install +%py3_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python3-camunda-external-task-client-python3 -f filelist.lst +%dir %{python3_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 10 2023 Python_Bot - 4.3.0-1 +- Package Spec generated -- cgit v1.2.3