PMC-926 Create a class JobsManager in order to build, setup and dispatch the jobs in PM

This commit is contained in:
Roly Rudy Gutierrez Pinto
2019-07-12 09:19:01 -04:00
parent 4ebbb83f82
commit 74f9a58d15

View File

@@ -0,0 +1,170 @@
<?php
namespace ProcessMaker\Core;
use Exception;
use Illuminate\Support\Facades\Log;
use ProcessMaker\BusinessModel\Factories\Jobs;
use ProcessMaker\Core\System;
use Propel;
class JobsManager
{
/**
* Single object instance to be used in the entire environment.
*
* @var object
*/
private static $jobsManager = null;
/**
* Delayed Dispatching: To delay the execution of a queued job.
* The time is
* in minutes.
* @var int
*/
private $delay;
/**
* Specifying Max Job Attempts: specifying the maximum number of times a job
* may be attempted.
* Number of times by default is 10, It is defined in env.ini file.
* @var int
*/
private $tries;
/**
* Job Expiration: Specifies how many seconds the queue connection should wait
* before retrying a job that is being processed.
* Time is in seconds.
* @var int
*/
private $retryAfter;
/**
* This is a list of the values that are saved from the current session.
* @var array
*/
private $sessionValues = [
'__SYSTEM_UTC_TIME_ZONE__',
'USER_LOGGED',
'USR_USERNAME',
'APPLICATION',
'INDEX',
'PROCESS',
'TASK',
];
/**
* It obtains a single object to be used as a record of the whole environment.
*
* @return object
*/
public static function getSingleton()
{
if (self::$jobsManager === null) {
self::$jobsManager = new JobsManager();
}
return self::$jobsManager;
}
/**
* This initialize environment configuration values.
*/
public function init()
{
$envs = System::getSystemConfiguration('', '', config("system.workspace"));
$this->delay = $envs['delay'];
$this->tries = $envs['tries'];
$this->retryAfter = $envs['retry_after'];
config(['queue.connections.database.retry_after' => $this->retryAfter]);
}
/**
* This obtains a status of the current values that are running. The status
* of the values will be used by the Job at a future time when the job is
* launched.
* @return array
*/
private function getDataSnapshot()
{
$constants = get_defined_constants(true);
$session = $this->getSessionValues();
return [
'errorReporting' => ini_get('error_reporting'),
'configuration' => Propel::getConfiguration(),
'constants' => $constants['user'],
'session' => $session,
'server' => $_SERVER,
];
}
/**
* This sets the status of the values when the job is launched. Accepts the
* result of the execution of the getDataSnapshot() method.
* @param array $environment
*/
private function recoverDataSnapshot($environment)
{
$this->prepareEnvironment($environment);
$_SESSION = $environment['session'];
$_SERVER = $environment['server'];
Propel::initConfiguration($environment['configuration']);
foreach ($environment['constants'] as $key => $value) {
if (!defined($key)) {
define($key, $value);
}
}
}
/**
* This allows you to configure the PHP environment policies. The parameter
* must contain the correct indices.
* @param array $environment
*/
private function prepareEnvironment($environment)
{
ini_set('error_reporting', $environment['errorReporting']);
}
/**
* This gets the values defined in the $this->sessionValues property from
* the current $_SESSION.
* @return array
*/
private function getSessionValues()
{
$result = [];
foreach ($this->sessionValues as $key) {
if (array_key_exists($key, $_SESSION)) {
$result[$key] = $_SESSION[$key];
}
}
return $result;
}
/**
* Dispatch a job to its appropriate handler.
* @param string $name
* @param Closure $callback
* @return object
*/
public function dispatch($name, $callback)
{
$environment = $this->getDataSnapshot();
$instance = Jobs::create($name, function() use ($callback, $environment) {
try {
$this->recoverDataSnapshot($environment);
$callback($environment);
} catch (Exception $e) {
Log::error($e->getMessage() . ": " . $e->getTraceAsString());
}
});
$instance->delay($this->delay);
return $instance;
}
}