diff options
author | Christoph Wurst <ChristophWurst@users.noreply.github.com> | 2018-10-19 07:40:35 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-19 07:40:35 +0200 |
commit | a1ea504edf529a364be9b66fda5d100d62dcc0b9 (patch) | |
tree | e3617226613c8cf17bd61ef0f710cf5ae25cec21 /lib | |
parent | 5daa4f27e1a4840a1a722729ca5ebafb6e749a43 (diff) | |
parent | 8493f49211290e3aea48cc9055a615b69725ac84 (diff) | |
download | nextcloud-server-a1ea504edf529a364be9b66fda5d100d62dcc0b9.tar.gz nextcloud-server-a1ea504edf529a364be9b66fda5d100d62dcc0b9.zip |
Merge pull request #11711 from nextcloud/feature/backgroundjobs_ocp
Add proper backgroundjobs to OCP
Diffstat (limited to 'lib')
-rw-r--r-- | lib/composer/composer/autoload_classmap.php | 3 | ||||
-rw-r--r-- | lib/composer/composer/autoload_static.php | 3 | ||||
-rw-r--r-- | lib/public/BackgroundJob/Job.php | 143 | ||||
-rw-r--r-- | lib/public/BackgroundJob/QueuedJob.php | 48 | ||||
-rw-r--r-- | lib/public/BackgroundJob/TimedJob.php | 62 |
5 files changed, 259 insertions, 0 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 9038eedecb2..863d0e62837 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -88,6 +88,9 @@ return array( 'OCP\\BackgroundJob' => $baseDir . '/lib/public/BackgroundJob.php', 'OCP\\BackgroundJob\\IJob' => $baseDir . '/lib/public/BackgroundJob/IJob.php', 'OCP\\BackgroundJob\\IJobList' => $baseDir . '/lib/public/BackgroundJob/IJobList.php', + 'OCP\\BackgroundJob\\Job' => $baseDir . '/lib/public/BackgroundJob/Job.php', + 'OCP\\BackgroundJob\\QueuedJob' => $baseDir . '/lib/public/BackgroundJob/QueuedJob.php', + 'OCP\\BackgroundJob\\TimedJob' => $baseDir . '/lib/public/BackgroundJob/TimedJob.php', 'OCP\\Calendar\\BackendTemporarilyUnavailableException' => $baseDir . '/lib/public/Calendar/BackendTemporarilyUnavailableException.php', 'OCP\\Calendar\\ICalendar' => $baseDir . '/lib/public/Calendar/ICalendar.php', 'OCP\\Calendar\\IManager' => $baseDir . '/lib/public/Calendar/IManager.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 57748b832cc..b14376045ab 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -118,6 +118,9 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c 'OCP\\BackgroundJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob.php', 'OCP\\BackgroundJob\\IJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/IJob.php', 'OCP\\BackgroundJob\\IJobList' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/IJobList.php', + 'OCP\\BackgroundJob\\Job' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/Job.php', + 'OCP\\BackgroundJob\\QueuedJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/QueuedJob.php', + 'OCP\\BackgroundJob\\TimedJob' => __DIR__ . '/../../..' . '/lib/public/BackgroundJob/TimedJob.php', 'OCP\\Calendar\\BackendTemporarilyUnavailableException' => __DIR__ . '/../../..' . '/lib/public/Calendar/BackendTemporarilyUnavailableException.php', 'OCP\\Calendar\\ICalendar' => __DIR__ . '/../../..' . '/lib/public/Calendar/ICalendar.php', 'OCP\\Calendar\\IManager' => __DIR__ . '/../../..' . '/lib/public/Calendar/IManager.php', diff --git a/lib/public/BackgroundJob/Job.php b/lib/public/BackgroundJob/Job.php new file mode 100644 index 00000000000..0f872355a94 --- /dev/null +++ b/lib/public/BackgroundJob/Job.php @@ -0,0 +1,143 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2018, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\BackgroundJob; + +use OCP\AppFramework\Utility\ITimeFactory; +use OCP\ILogger; + +/** + * Base class for background jobs + * + * This is here if you want to do advanced stuff in your background jobs. + * For the most common use cases have a look at QueuedJob and TimedJob + * + * @since 15.0.0 + */ +abstract class Job implements IJob { + + /** @var int $id */ + protected $id; + + /** @var int $lastRun */ + protected $lastRun; + + /** @var mixed $argument */ + protected $argument; + + /** @var ITimeFactory */ + protected $time; + + /** + * @since 15.0.0 + */ + public function __construct(ITimeFactory $time) { + $this->time = $time; + } + + /** + * The function to prepare the execution of the job. + + * + * @param IJobList $jobList + * @param ILogger|null $logger + * + * @since 15.0.0 + */ + public function execute($jobList, ILogger $logger = null) { + $jobList->setLastRun($this); + if ($logger === null) { + $logger = \OC::$server->getLogger(); + } + + try { + $jobStartTime = $this->time->getTime(); + $logger->debug('Run ' . get_class($this) . ' job with ID ' . $this->getId(), ['app' => 'cron']); + $this->run($this->argument); + $timeTaken = $this->time->getTime() - $jobStartTime; + + $logger->debug('Finished ' . get_class($this) . ' job with ID ' . $this->getId() . ' in ' . $timeTaken . ' seconds', ['app' => 'cron']); + $jobList->setExecutionTime($this, $timeTaken); + } catch (\Exception $e) { + if ($logger) { + $logger->logException($e, [ + 'app' => 'core', + 'message' => 'Error while running background job (class: ' . get_class($this) . ', arguments: ' . print_r($this->argument, true) . ')' + ]); + } + } + } + + /** + * @since 15.0.0 + */ + final public function setId($id) { + $this->id = $id; + } + + /** + * @since 15.0.0 + */ + final public function setLastRun($lastRun) { + $this->lastRun = $lastRun; + } + + /** + * @since 15.0.0 + */ + public function setArgument($argument) { + $this->argument = $argument; + } + + /** + * @since 15.0.0 + */ + final public function getId(): int { + return $this->id; + } + + /** + * @since 15.0.0 + */ + final public function getLastRun(): int { + return $this->lastRun; + } + + /** + * @since 15.0.0 + */ + public function getArgument() { + return $this->argument; + } + + /** + * The actual function that is called to run the job + * + * @param $argument + * @return mixed + * + * @since 15.0.0 + */ + abstract protected function run($argument); +} diff --git a/lib/public/BackgroundJob/QueuedJob.php b/lib/public/BackgroundJob/QueuedJob.php new file mode 100644 index 00000000000..4964ed9ad33 --- /dev/null +++ b/lib/public/BackgroundJob/QueuedJob.php @@ -0,0 +1,48 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2018, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\BackgroundJob; + +use OCP\ILogger; + +/** + * Simple base class for a one time background job + * + * @since 15.0.0 + */ +abstract class QueuedJob extends Job { + + /** + * run the job, then remove it from the joblist + * + * @param IJobList $jobList + * @param ILogger|null $logger + * + * @since 15.0.0 + */ + final public function execute($jobList, ILogger $logger = null) { + $jobList->remove($this, $this->argument); + parent::execute($jobList, $logger); + } +} diff --git a/lib/public/BackgroundJob/TimedJob.php b/lib/public/BackgroundJob/TimedJob.php new file mode 100644 index 00000000000..d58ea05d31c --- /dev/null +++ b/lib/public/BackgroundJob/TimedJob.php @@ -0,0 +1,62 @@ +<?php +declare(strict_types=1); +/** + * @copyright Copyright (c) 2018, Roeland Jago Douma <roeland@famdouma.nl> + * + * @author Roeland Jago Douma <roeland@famdouma.nl> + * + * @license GNU AGPL version 3 or any later version + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + */ + +namespace OCP\BackgroundJob; + +use OC\BackgroundJob\JobList; +use OCP\ILogger; + +/** + * Simple base class to extend to run periodic background jobs. + * Call setInterval with your desired interval in seconds from the constructor. + * + * @since 15.0.0 + */ +abstract class TimedJob extends Job { + /** @var int */ + protected $interval = 0; + + /** + * set the interval for the job + * + * @since 15.0.0 + */ + public function setInterval(int $interval) { + $this->interval = $interval; + } + + /** + * run the job if the last run is is more than the interval ago + * + * @param JobList $jobList + * @param ILogger|null $logger + * + * @since 15.0.0 + */ + final public function execute($jobList, ILogger $logger = null) { + if (($this->time->getTime() - $this->lastRun) > $this->interval) { + parent::execute($jobList, $logger); + } + } +} |