diff --git a/app/Console/Commands/WorkCommand.php b/app/Console/Commands/WorkCommand.php new file mode 100644 index 000000000..708e8c114 --- /dev/null +++ b/app/Console/Commands/WorkCommand.php @@ -0,0 +1,59 @@ +signature .= ' + {--workspace=workflow : ProcessMaker Indicates the workspace to be processed.} + {--processmakerPath=./ : ProcessMaker path.} + '; + + $this->description .= ' (ProcessMaker has extended this command)'; + + parent::__construct($worker); + } + + /** + * Run the worker instance. + * + * @param string $connection + * @param string $queue + */ + protected function runWorker($connection, $queue) + { + $workspace = $this->option('workspace'); + + if (!empty($workspace)) { + $webApplication = new WebApplication(); + $webApplication->setRootDir($this->option('processmakerPath')); + $webApplication->loadEnvironment($workspace); + } + parent::runWorker($connection, $queue); + } + + /** + * Gather all of the queue worker options as a single object. + * + * @return \Illuminate\Queue\WorkerOptions + */ + protected function gatherWorkerOptions() + { + $options = parent::gatherWorkerOptions(); + return $options; + } +} diff --git a/app/Providers/WorkCommandServiceProvider.php b/app/Providers/WorkCommandServiceProvider.php new file mode 100644 index 000000000..c745f818f --- /dev/null +++ b/app/Providers/WorkCommandServiceProvider.php @@ -0,0 +1,24 @@ +app->extend('command.queue.work', function ($command, $app) { + return new WorkCommand($app['queue.worker']); + }); + } +} diff --git a/workflow/engine/bin/tasks/cliWorkspaces.php b/workflow/engine/bin/tasks/cliWorkspaces.php index 13df97e38..0e9f3a5a6 100644 --- a/workflow/engine/bin/tasks/cliWorkspaces.php +++ b/workflow/engine/bin/tasks/cliWorkspaces.php @@ -1,5 +1,6 @@ > No MySQL 5.7 incompatibilities in variables found for this workspace." . PHP_EOL; } -} \ No newline at end of file +} + +/** + * This function obtains the connection parameters and passes them to the artisan. + * All artisan options can be applied. For more information on artisan options use + * php artisan --help + * @param array $args + */ +function run_artisan($args) +{ + $jobsManager = JobsManager::getSingleton()->init(); + $workspace = $jobsManager->getOptionValueFromArguments($args, "--workspace"); + if ($workspace !== false) { + config(['system.workspace' => $workspace]); + + $tries = $jobsManager->getOptionValueFromArguments($args, "--tries"); + if ($tries === false) { + $tries = $jobsManager->getTries(); + } + + $processmakerPath = PROCESSMAKER_PATH; + $otherOptions = "--processmakerPath={$processmakerPath} "; + + $options = implode(" ", $args) + . " --tries={$tries}"; + CLI::logging("> artisan {$options}\n"); + + passthru(PHP_BINARY . " artisan {$otherOptions} {$options}"); + } else { + CLI::logging("> The --workspace option is undefined.\n"); + } +} diff --git a/workflow/engine/src/ProcessMaker/Core/JobsManager.php b/workflow/engine/src/ProcessMaker/Core/JobsManager.php index e77b0d00d..cd2ea1480 100644 --- a/workflow/engine/src/ProcessMaker/Core/JobsManager.php +++ b/workflow/engine/src/ProcessMaker/Core/JobsManager.php @@ -55,6 +55,33 @@ class JobsManager 'TASK', ]; + /** + * Get delay property. + * @return int + */ + public function getDelay() + { + return $this->delay; + } + + /** + * Get tries property. + * @return int + */ + public function getTries() + { + return $this->tries; + } + + /** + * Get retryAfter property. + * @return int + */ + public function getRetryAfter() + { + return $this->retryAfter; + } + /** * It obtains a single object to be used as a record of the whole environment. * @@ -70,6 +97,7 @@ class JobsManager /** * This initialize environment configuration values. + * @return JobsManager */ public function init() { @@ -79,6 +107,7 @@ class JobsManager $this->retryAfter = $envs['retry_after']; config(['queue.connections.database.retry_after' => $this->retryAfter]); + return $this; } /** @@ -167,4 +196,24 @@ class JobsManager return $instance; } + + /** + * This gets the value of the option specified in the second parameter from an + * array that represents the arguments. + * If the option is not found, it returns false. + * @param array $arguments + * @param string $option + * @return string|boolean + */ + public function getOptionValueFromArguments($arguments, $option, $allocationSeparator = "=") + { + $option = $option . $allocationSeparator; + $result = preg_grep("/{$option}/", $arguments); + if (empty($result)) { + return false; + } + $string = array_pop($result); + $value = str_replace($option, "", $string); + return trim($value); + } }