From 50ef48b5b0a4609dc0c46cbcdd93417234abf9a2 Mon Sep 17 00:00:00 2001 From: Roeland Jago Douma Date: Thu, 27 Dec 2018 10:50:46 +0100 Subject: [PATCH] Pimp backgroundjobs Signed-off-by: Roeland Jago Douma --- developer_manual/app/backgroundjobs.rst | 116 +++++++++++++++++++++--- 1 file changed, 101 insertions(+), 15 deletions(-) diff --git a/developer_manual/app/backgroundjobs.rst b/developer_manual/app/backgroundjobs.rst index 2e956c93b53..d1fa2852058 100644 --- a/developer_manual/app/backgroundjobs.rst +++ b/developer_manual/app/backgroundjobs.rst @@ -4,36 +4,122 @@ Background jobs (Cron) .. sectionauthor:: Bernhard Posselt -Background/cron jobs are usually registered in the :file:`appinfo/app.php` by using the **addRegularTask** method, the class and the method to run: +Often there is a need to run background jobs. For example there are Background +jobs in Nextcloud that send out the activity emails. Or expire the trashbin. -.. code-block:: php +Types of background jobs +------------------------ +Nextcloud by default offers you two types of background jobs. The ``\OCP\BackgroundJob\QueuedJob`` +and ```\OCP\BackgroundJob\TimedJob``. - getContainer(); - $container->query('SomeService')->run(); + public function __construct(ITimeFactory $time, SomeService $service) { + parent::__construct($time); + $this->myService = $service; + + // Run once an hour + parent::setInterval(3600); + } + + public static function run($arguments) { + $this->myService->doCron($arguments['uid']); } } -Don't forget to configure the cron service on the server by executing:: +As you can see our dependency injection also works just fine for background jobs. +The ITimeFactory always needs to be passed to the parent constructor. Since it is +required to be set. + +In this case it is a background job that runs every hour. And we take the ``uid`` arguemnt +to pass on to the service to run the background job. + +The ``run`` function is the main thing you need to implement and where all the +logic happens. + +Registering a background job +---------------------------- + +Now that you have written your background job there is of course the small matter of +how to make sure the system actually runs your job. In order to do this your +job needs to be registered. + +info.xml +^^^^^^^^ + +You can register your jobs in your info.xml by addning; + +.. code-block:: xml + + + OCA\MyApp\Cron\SomeTask + + +This will on install/update of the application add the job ``OCA\MyApp\Cron\SomeTask``. +Of course in this case the arguments passed to your ``run`` function is just an empty +array. - sudo crontab -u http -e +Registering manually +^^^^^^^^^^^^^^^^^^^^ -where **http** is your Web server user, and add:: +In case you want more fine grained control about when a background job is inserted +and you want to pass arguments to it you need to manually register your background jobs. + +You do this by using ``\OCP\BackgroundJob\IJobList``. There you can add a job or remove a job. + +For example you could add or remove a certain job based on some controller: + +.. code-block:: php + + jobList = $jobList; + } + + public function addJob(string $uid) { + $this->jobList->add(SomeTask::class, ['uid' => $uid]); + } + + public function removeJob(string $uid) { + $this->jobList->remove(SomeTask::class, ['uid' => $uid]); + } + } - */15 * * * * php -f /srv/http/nextcloud/cron.php +This provides more fine grained control and you can pass arguments to your background +jobs easily.