ILIAS  release_6 Revision v6.24-5-g0c8bfefb3b8
All Data Structures Namespaces Files Functions Variables Modules Pages
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 }
executeTask(Task $task, Observer $observer)
Actually executes a task.
$DIC
Definition: xapitoken.php:46
$ilIliasIniFile
$client_id
$_COOKIE[session_name()]
Definition: xapitoken.php:39
run(Bucket $bucket)
This will add an Observer of the Task and start running the task.