ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
AsyncTaskManager.php
Go to the documentation of this file.
1<?php
2
4
10
12{
13 const CMD_START_WORKER = 'startBackgroundTaskWorker';
14
15
25 public function run(Bucket $bucket)
26 {
27 global $DIC;
28
29 $bucket->setState(State::SCHEDULED);
30 $bucket->setCurrentTask($bucket->getTask());
31 $DIC->backgroundTasks()->persistence()->saveBucketAndItsTasks($bucket);
32
33 $DIC->logger()->root()->info("[BT] Trying to call webserver");
34
35 // Call SOAP-Server
36 $soap_client = new \ilSoapClient();
37 $soap_client->setResponseTimeout(1);
38 $soap_client->enableWSDL(true);
39 $soap_client->init();
40 $session_id = session_id();
41 $client_id = $_COOKIE['ilClientId'];
42 try {
43 $call = $soap_client->call(self::CMD_START_WORKER, array(
44 $session_id . '::' . $client_id,
45 ));
46 } catch (\Throwable $t) {
47 $DIC->logger()->root()->info("[BT] Calling Webserver failed, fallback to sync version");
48 $sync_manager = new SyncTaskManager($this->persistence);
49 $sync_manager->run($bucket);
50 } finally {
51 $DIC->logger()->root()->info("[BT] Calling webserver successful");
52 }
53 }
54
55
56 public function runAsync()
57 {
58 global $DIC, $ilIliasIniFile;
59
60 $n_of_tasks = $ilIliasIniFile->readVariable("background_tasks", "number_of_concurrent_tasks");
61 $n_of_tasks = $n_of_tasks ? $n_of_tasks : 5;
62
63 $DIC->logger()->root()->info("[BackgroundTask] Starting background job.");
64 $persistence = $DIC->backgroundTasks()->persistence();
65
66 // TODO search over all clients.
67 $MAX_PARALLEL_JOBS = $n_of_tasks;
68 if (count($persistence->getBucketIdsByState(State::RUNNING)) >= $MAX_PARALLEL_JOBS) {
69 $DIC->logger()->root()->info("[BT] Too many running jobs, worker going down.");
70
71 return;
72 }
73
74 while (true) {
75 $ids = $persistence->getBucketIdsByState(State::SCHEDULED);
76 if (!count($ids)) {
77 break;
78 }
79
80 $bucket = $persistence->loadBucket(array_shift($ids));
81 $observer = new PersistingObserver($bucket, $persistence);
82 $task = $bucket->getTask();
83
84 try {
85 $this->executeTask($task, $observer);
86 $bucket->setState(State::FINISHED);
87 $this->persistence->updateBucket($bucket);
89 $bucket->setState(State::FINISHED);
90 $this->persistence->deleteBucket($bucket);
92 // We're okay!
93 $this->persistence->saveBucketAndItsTasks($bucket);
94 } catch (\Exception $e) {
95 $persistence->deleteBucket($bucket);
96 $DIC->logger()->root()->info("[BT] Exception while async computing: "
97 . $e->getMessage());
98 $DIC->logger()->root()->info("[BT] Stack Trace: "
99 . $e->getTraceAsString());
100 }
101 }
102
103 $DIC->logger()->root()->info("[BT] One worker going down because there's nothing left to do.");
104
105 return true;
106 }
107}
An exception for terminatinating execution or to throw for unit testing.
run(Bucket $bucket)
This will add an Observer of the Task and start running the task.
$client_id
executeTask(Task $task, Observer $observer)
Actually executes a task.
$ilIliasIniFile
$DIC
Definition: xapitoken.php:46
$_COOKIE[session_name()]
Definition: xapitoken.php:39