public async Task ProcessLockedTasks(string workerId, LockedExternalTask lockedExternalTask)
        {
            var executor          = GetExecutor(lockedExternalTask.TopicName);
            var executorAttribute = GetExecutorAttributeData(executor);
            var externalTask      = lockedExternalTask.ToExternalTask();

            try
            {
                var resultVariables = await ExecuteExternalTask(executor, externalTask);

                var completeExternalTask = new CompleteExternalTask
                {
                    WorkerId  = workerId,
                    Variables = resultVariables.ToVariableDictionary()
                };

                await _engineClient.Client().ExternalTasks[externalTask.Id].Complete(completeExternalTask);
            }
            catch (ExternalTaskException ex)
            {
                HandleExternalTaskException(workerId, externalTask, ex);
            }
            catch (Exception ex)
            {
                HandleException(workerId, executorAttribute, externalTask, ex);
            }
        }
        private void Execute(LockedExternalTask lockedExternalTask, Type type)
        {
            ExternalTask externalTask    = lockedExternalTask.ToExternalTask();
            var          resultVariables = new Dictionary <string, object>();

            try
            {
                LogEventToConsole($"{externalTask.ProcessDefinitionId} {externalTask.TopicName} Started", "INFO");

                CreateAdapterInstanceAndExecute(externalTask, ref resultVariables, type);

                LogEventToConsole($"{externalTask.ProcessDefinitionId} {externalTask.TopicName} Finished", "INFO");

                CompleteExternalTask completeExternalTask = new CompleteExternalTask()
                {
                    WorkerId  = _workerId,
                    Variables = resultVariables.ToVariableDictionary()
                };
                _camundaClient.ExternalTasks[externalTask.Id].Complete(completeExternalTask);
            }
            catch (ExternalTaskException ex)
            {
                LogEventToConsole($"{externalTask.ProcessDefinitionId} {externalTask.TopicName} {ex.Message}", "ERROR");

                ExternalTaskBpmnError externalTaskBpmnError = new ExternalTaskBpmnError()
                {
                    WorkerId  = _workerId,
                    ErrorCode = ex.BusinessErrorCode
                };
                _camundaClient.ExternalTasks[externalTask.Id].HandleBpmnError(externalTaskBpmnError);
            }
            catch (Exception ex)
            {
                LogEventToConsole($"{externalTask.ProcessDefinitionId} {externalTask.TopicName} {ex.Message}", "ERROR");

                var retriesLeft = _externalTaskWorkerInfo.Retries; // start with default
                if (externalTask.Retries.HasValue)                 // or decrement if retries are already set
                {
                    retriesLeft = externalTask.Retries.Value - 1;
                }

                ExternalTaskFailure externalTaskFailure = new ExternalTaskFailure()
                {
                    WorkerId     = _workerId,
                    ErrorMessage = ex.Message,
                    ErrorDetails = ex.StackTrace,
                    RetryTimeout = _externalTaskWorkerInfo.RetryTimeout,
                    Retries      = retriesLeft
                };

                _camundaClient.ExternalTasks[externalTask.Id].HandleFailure(externalTaskFailure);
            }
        }