class Crontab in Ultimate Cron 8.2
Crontab scheduler.
Plugin annotation
@SchedulerPlugin(
id = "crontab",
title = @Translation("Crontab"),
description = @Translation("Use crontab rules for scheduling jobs."),
)
Hierarchy
- class \Drupal\Component\Plugin\PluginBase implements DerivativeInspectionInterface, PluginInspectionInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
- class \Drupal\ultimate_cron\CronPlugin implements ConfigurableInterface, DependentPluginInterface, PluginInspectionInterface, PluginFormInterface
- class \Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler\SchedulerBase implements SchedulerInterface
- class \Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler\Crontab
- class \Drupal\ultimate_cron\Plugin\ultimate_cron\Scheduler\SchedulerBase implements SchedulerInterface
- class \Drupal\ultimate_cron\CronPlugin implements ConfigurableInterface, DependentPluginInterface, PluginInspectionInterface, PluginFormInterface
- class \Drupal\Core\Plugin\PluginBase uses DependencySerializationTrait, MessengerTrait, StringTranslationTrait
Expanded class hierarchy of Crontab
2 files declare their use of Crontab
- RulesUnitTest.php in tests/
src/ Unit/ RulesUnitTest.php - SchedulerPluginTest.php in tests/
src/ Kernel/ SchedulerPluginTest.php
2 string references to 'Crontab'
- SchedulerSettingsForm::buildForm in src/
Form/ SchedulerSettingsForm.php - Form constructor.
- ultimate_cron.schema.yml in config/
schema/ ultimate_cron.schema.yml - config/schema/ultimate_cron.schema.yml
File
- src/
Plugin/ ultimate_cron/ Scheduler/ Crontab.php, line 19
Namespace
Drupal\ultimate_cron\Plugin\ultimate_cron\SchedulerView source
class Crontab extends SchedulerBase {
/**
* Default settings.
* @todo: $catch_up is randomly failing when value is low in some situation. 0 value is ignoring catch_up checks.
*/
public function defaultConfiguration() {
return array(
'rules' => array(
'0+@ */3 * * *',
),
'catch_up' => '0',
);
}
/**
* {@inheritdoc}
*/
public function formatLabel(CronJob $job) {
return implode("\n", $this->configuration['rules']);
}
/**
* {@inheritdoc}
*/
public function formatLabelVerbose(CronJob $job) {
$parsed = '';
$next_schedule = NULL;
$time = REQUEST_TIME;
$skew = $this
->getSkew($job);
foreach ($this->configuration['rules'] as $rule) {
$cron = CronRule::factory($rule, $time, $skew);
$parsed .= $cron
->parseRule() . "\n";
$result = $cron
->getNextSchedule();
$next_schedule = is_null($next_schedule) || $next_schedule > $result ? $result : $next_schedule;
$result = $cron
->getLastSchedule();
if ($time < $result + $this->configuration['catch_up']) {
$result = floor($time / 60) * 60 + 60;
$next_schedule = $next_schedule > $result ? $result : $next_schedule;
}
}
$parsed .= t('Next scheduled run at @datetime', array(
'@datetime' => \Drupal::service('date.formatter')
->format($next_schedule, 'custom', 'Y-m-d H:i:s'),
));
return $parsed;
}
/**
* {@inheritdoc}
*/
public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
$form['rules'][0] = array(
'#title' => t("Rules"),
'#type' => 'textfield',
'#default_value' => $this->configuration['rules'],
'#description' => t('Comma separated list of crontab rules.'),
'#fallback' => TRUE,
'#required' => TRUE,
);
$form['rules_help'] = array(
'#type' => 'fieldset',
'#title' => t('Rules help'),
'#collapsible' => TRUE,
'#collapsed' => TRUE,
);
$form['rules_help']['info'] = array(
'#markup' => file_get_contents(drupal_get_path('module', 'ultimate_cron') . '/help/rules.html'),
);
$form['catch_up'] = array(
'#title' => t("Catch up"),
'#type' => 'textfield',
'#default_value' => $this->configuration['catch_up'],
'#description' => t("Don't run job after X seconds of rule."),
'#fallback' => TRUE,
'#required' => TRUE,
);
return $form;
}
/**
* {@inheritdoc}
*/
public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {
parent::validateConfigurationForm($form, $form_state);
$rule = $form_state
->getValues()['scheduler']['configuration']['rules'][0];
$cron = CronRule::factory($rule);
if (!$cron
->isValid()) {
$form_state
->setErrorByName('scheduler][configuration][rules][0', t('Rule is invalid'));
}
}
/**
* {@inheritdoc}
*/
public function settingsFormSubmit(&$form, &$form_state, CronJob $job = NULL) {
$values =& $form_state['values']['settings'][$this->type][$this->name];
if (!empty($values['rules'])) {
$rules = explode(',', $values['rules']);
$values['rules'] = array_map('trim', $rules);
}
}
/**
* {@inheritdoc}
*/
public function isScheduled(CronJob $job) {
$log_entry = isset($job->log_entry) ? $job->log_entry : $job
->loadLatestLogEntry();
$skew = $this
->getSkew($job);
$class = get_class($this);
return $class::shouldRun($this->configuration['rules'], $log_entry->start_time, NULL, $this->configuration['catch_up'], $skew) ? TRUE : FALSE;
}
/**
* {@inheritdoc}
*/
public static function shouldRun($rules, $job_last_ran, $time = NULL, $catch_up = 0, $skew = 0) {
$time = is_null($time) ? time() : $time;
foreach ($rules as $rule) {
$cron = CronRule::factory($rule, $time, $skew);
$cron_last_ran = $cron
->getLastSchedule();
// @todo: Right now second test is failing randomly on low $catch_up value.
if ($job_last_ran < $cron_last_ran && $cron_last_ran <= $time) {
if ($time <= $cron_last_ran + $catch_up || $catch_up == 0) {
return $time - $job_last_ran;
}
}
}
return FALSE;
}
/**
* {@inheritdoc}
*/
public function isBehind(CronJob $job) {
// Disabled jobs are not behind!
if (!$job
->status()) {
return FALSE;
}
$log_entry = isset($job->log_entry) ? $job->log_entry : $job
->loadLatestLogEntry();
// If job hasn't run yet, then who are we to say it's behind its schedule?
// Check the registered time, and use that if it's available.
$job_last_ran = $log_entry->start_time;
if (!$job_last_ran) {
$registered = \Drupal::config('ultimate_cron')
->get('ultimate_cron_hooks_registered');
if (empty($registered[$job
->id()])) {
return FALSE;
}
$job_last_ran = $registered[$job
->id()];
}
$skew = $this
->getSkew($job);
$next_schedule = NULL;
foreach ($this->configuration['rules'] as $rule) {
$cron = CronRule::factory($rule, $job_last_ran, $skew);
$time = $cron
->getNextSchedule();
$next_schedule = is_null($next_schedule) || $time < $next_schedule ? $time : $next_schedule;
}
$behind = REQUEST_TIME - $next_schedule;
return $behind > $this->configuration['catch_up'] ? $behind : FALSE;
}
/**
* Get a "unique" skew for a job.
*/
protected function getSkew(CronJob $job) {
return $job
->getUniqueID() & 0xff;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
CronPlugin:: |
public static | property | ||
CronPlugin:: |
public static | property | ||
CronPlugin:: |
public static | property | 1 | |
CronPlugin:: |
public | property | ||
CronPlugin:: |
public | function |
Calculates dependencies for the configured plugin. Overrides DependentPluginInterface:: |
|
CronPlugin:: |
public | function | Clean form of empty fallback values. | |
CronPlugin:: |
public | function | Modified version drupal_array_get_nested_value(). | |
CronPlugin:: |
public | function | Process fallback form parameters. | |
CronPlugin:: |
public | function |
Gets this plugin's configuration. Overrides ConfigurableInterface:: |
|
CronPlugin:: |
public static | function | Get global plugin option. | |
CronPlugin:: |
public static | function | Get all global plugin options. | |
CronPlugin:: |
public static | function | Returns a list of plugin types. | |
CronPlugin:: |
public | function | Default plugin valid for all jobs. | 1 |
CronPlugin:: |
public | function |
Sets the configuration for this plugin instance. Overrides ConfigurableInterface:: |
|
CronPlugin:: |
public static | function | Set global plugin option. | |
CronPlugin:: |
public | function | Get label for a specific setting. | 1 |
CronPlugin:: |
public | function |
Form submission handler. Overrides PluginFormInterface:: |
|
CronPlugin:: |
public | function |
Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides PluginBase:: |
2 |
Crontab:: |
public | function |
Form constructor. Overrides CronPlugin:: |
1 |
Crontab:: |
public | function |
Default settings.
@todo: $catch_up is randomly failing when value is low in some situation. 0 value is ignoring catch_up checks. Overrides CronPlugin:: |
1 |
Crontab:: |
public | function |
Label for schedule. Overrides SchedulerInterface:: |
1 |
Crontab:: |
public | function |
Label for schedule. Overrides SchedulerInterface:: |
|
Crontab:: |
protected | function | Get a "unique" skew for a job. | |
Crontab:: |
public | function |
Check if job is behind schedule. Overrides SchedulerBase:: |
|
Crontab:: |
public | function |
Check job schedule. Overrides SchedulerBase:: |
|
Crontab:: |
public | function | ||
Crontab:: |
public static | function | ||
Crontab:: |
public | function |
Form validation handler. Overrides CronPlugin:: |
|
DependencySerializationTrait:: |
protected | property | An array of entity type IDs keyed by the property name of their storages. | |
DependencySerializationTrait:: |
protected | property | An array of service IDs keyed by property name used for serialization. | |
DependencySerializationTrait:: |
public | function | 1 | |
DependencySerializationTrait:: |
public | function | 2 | |
MessengerTrait:: |
protected | property | The messenger. | 29 |
MessengerTrait:: |
public | function | Gets the messenger. | 29 |
MessengerTrait:: |
public | function | Sets the messenger. | |
PluginBase:: |
protected | property | Configuration information passed into the plugin. | 1 |
PluginBase:: |
protected | property | The plugin implementation definition. | 1 |
PluginBase:: |
protected | property | The plugin_id. | |
PluginBase:: |
constant | A string which is used to separate base plugin IDs from the derivative ID. | ||
PluginBase:: |
public | function |
Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface:: |
|
PluginBase:: |
public | function |
Gets the definition of the plugin implementation. Overrides PluginInspectionInterface:: |
3 |
PluginBase:: |
public | function |
Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface:: |
|
PluginBase:: |
public | function | Determines if the plugin is configurable. | |
StringTranslationTrait:: |
protected | property | The string translation service. | 1 |
StringTranslationTrait:: |
protected | function | Formats a string containing a count of items. | |
StringTranslationTrait:: |
protected | function | Returns the number of plurals supported by a given language. | |
StringTranslationTrait:: |
protected | function | Gets the string translation service. | |
StringTranslationTrait:: |
public | function | Sets the string translation service to use. | 2 |
StringTranslationTrait:: |
protected | function | Translates a string to the current language or to a given language. |