Merged in bugfix/PMC-963 (pull request #6979)

PMC-963 We need a new artisan command to run the pending jobs, because we need to load the workspace configuration

Approved-by: Julio Cesar Laura Avendaño <contact@julio-laura.com>
This commit is contained in:
Roly
2019-07-18 17:55:33 +00:00
committed by Julio Cesar Laura Avendaño
4 changed files with 180 additions and 1 deletions

View File

@@ -0,0 +1,59 @@
<?php
namespace App\Console\Commands;
use Illuminate\Queue\Console\WorkCommand as BaseWorkCommand;
use Illuminate\Queue\Worker;
use Maveriks\WebApplication;
class WorkCommand extends BaseWorkCommand
{
/**
* Create a new queue work command.
*
* @param \Illuminate\Queue\Worker $worker
*
* @return void
*/
public function __construct(Worker $worker)
{
$this->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;
}
}

View File

@@ -0,0 +1,24 @@
<?php
namespace App\Providers;
use App\Console\Commands\WorkCommand;
use Illuminate\Queue\QueueServiceProvider;
class WorkCommandServiceProvider extends QueueServiceProvider
{
/**
* Overrides "register" method from Queue provider.
* @return void
*/
public function register()
{
parent::register();
//Extend command "queue:work".
$this->app->extend('command.queue.work', function ($command, $app) {
return new WorkCommand($app['queue.worker']);
});
}
}

View File

@@ -1,5 +1,6 @@
<?php <?php
use ProcessMaker\Core\JobsManager;
use ProcessMaker\Model\Process; use ProcessMaker\Model\Process;
use ProcessMaker\Validation\MySQL57; use ProcessMaker\Validation\MySQL57;
@@ -390,6 +391,21 @@ CLI::taskArg("workspace-name", true, true);
CLI::taskRun("run_check_queries_incompatibilities"); CLI::taskRun("run_check_queries_incompatibilities");
/*********************************************************************/ /*********************************************************************/
/**
* This command executes "artisan" loading the workspace connection parameters
*/
CLI::taskName('artisan');
CLI::taskDescription(<<<EOT
This command executes "artisan" loading the workspace parameters.
Example:
./processmaker artisan queue:work --workspace=workflow
To see other command options please refer to the artisan help.
php artisan --help
EOT
);
CLI::taskRun("run_artisan");
/** /**
* Function run_info * Function run_info
* *
@@ -1463,3 +1479,34 @@ function check_queries_incompatibilities($wsName)
echo ">> No MySQL 5.7 incompatibilities in variables found for this workspace." . PHP_EOL; echo ">> No MySQL 5.7 incompatibilities in variables found for this workspace." . PHP_EOL;
} }
} }
/**
* 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");
}
}

View File

@@ -55,6 +55,33 @@ class JobsManager
'TASK', '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. * 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. * This initialize environment configuration values.
* @return JobsManager
*/ */
public function init() public function init()
{ {
@@ -79,6 +107,7 @@ class JobsManager
$this->retryAfter = $envs['retry_after']; $this->retryAfter = $envs['retry_after'];
config(['queue.connections.database.retry_after' => $this->retryAfter]); config(['queue.connections.database.retry_after' => $this->retryAfter]);
return $this;
} }
/** /**
@@ -167,4 +196,24 @@ class JobsManager
return $instance; 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);
}
} }