ILIAS  release_10 Revision v10.1-43-ga1241a92c2f
AsyncTaskManager.php
Go to the documentation of this file.
1 <?php
2 
20 
27 
29 {
30  public const CMD_START_WORKER = 'startBackgroundTaskWorker';
31 
36  public function run(Bucket $bucket): void
37  {
38  global $DIC;
39 
40  // check this before saving the bucket state to prevent an orphaned entry with 0%
41  if (!$DIC->settings()->get('soap_user_administration')) {
42  $DIC->logger()->bgtk()->warning("SOAP not enabled, fallback to sync version");
43  $sync_manager = new SyncTaskManager($this->persistence);
44  $sync_manager->run($bucket);
45  return;
46  }
47 
48  $bucket->setState(State::SCHEDULED);
49  $bucket->setCurrentTask($bucket->getTask());
50  $DIC->backgroundTasks()->persistence()->saveBucketAndItsTasks($bucket);
51 
52  $DIC->logger()->bgtk()->info("Trying to call webserver");
53 
54  // Call SOAP-Server
55  $soap_client = new \ilSoapClient();
56  $soap_client->setResponseTimeout(0);
57  $soap_client->enableWSDL(true);
58  $soap_client->init();
59  $session_id = session_id();
60  $client_id = $DIC->http()->wrapper()->cookie()->retrieve(
61  'ilClientId',
62  $DIC->refinery()->byTrying([
63  $DIC->refinery()->kindlyTo()->string(),
64  $DIC->refinery()->always(
65  defined('CLIENT_ID') ? CLIENT_ID : null
66  )
67  ])
68  );
69 
70  try {
71  $soap_client->call(self::CMD_START_WORKER, array(
72  $session_id . '::' . $client_id,
73  ));
74  } catch (\Throwable $t) {
75  $DIC->logger()->bgtk()->warning($t->getMessage());
76  $DIC->logger()->bgtk()->warning("Calling webserver failed, fallback to sync version");
77  $sync_manager = new SyncTaskManager($this->persistence);
78  $sync_manager->run($bucket);
79  return;
80  }
81  $DIC->logger()->bgtk()->info("Calling webserver successful");
82  }
83 
87  public function runAsync()
88  {
89  global $DIC, $ilIliasIniFile;
90 
91  $n_of_tasks = $ilIliasIniFile->readVariable("background_tasks", "number_of_concurrent_tasks");
92  $n_of_tasks = $n_of_tasks ? $n_of_tasks : 5;
93 
94  $DIC->logger()->bgtk()->info("Starting background job.");
95  $persistence = $DIC->backgroundTasks()->persistence();
96 
97  // TODO search over all clients.
98  $MAX_PARALLEL_JOBS = $n_of_tasks;
99  if (count($persistence->getBucketIdsByState(State::RUNNING)) >= $MAX_PARALLEL_JOBS) {
100  $DIC->logger()->bgtk()->info("Too many running jobs, worker going down.");
101 
102  return;
103  }
104 
105  while (true) {
107  if (count($ids) === 0) {
108  break;
109  }
110 
111  $bucket = $persistence->loadBucket(array_shift($ids));
112  $observer = new PersistingObserver($bucket, $persistence);
113  $task = $bucket->getTask();
114 
115  try {
116  $this->executeTask($task, $observer);
117  $bucket->setState(State::FINISHED);
118  $this->persistence->updateBucket($bucket);
120  $bucket->setState(State::FINISHED);
121  $this->persistence->deleteBucket($bucket);
122  } catch (UserInteractionRequiredException $e) {
123  // We're okay!
124  $this->persistence->saveBucketAndItsTasks($bucket);
125  } catch (\Exception $e) {
126  $persistence->deleteBucket($bucket);
127  $DIC->logger()->bgtk()->info("Exception while async computing: "
128  . $e->getMessage());
129  $DIC->logger()->bgtk()->info("Stack Trace: "
130  . $e->getTraceAsString());
131  }
132  }
133 
134  $DIC->logger()->bgtk()->info("One worker going down because there's nothing left to do.");
135 
136  return true;
137  }
138 }
executeTask(Task $task, Observer $observer)
Actually executes a task.
loadBucket(int $bucket_container_id)
$ilIliasIniFile
Definition: server.php:35
const CLIENT_ID
Definition: constants.php:41
global $DIC
Definition: shib_login.php:25
deleteBucket(Bucket $bucket)
Delete the bucket and all its stuff.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Definition: Option.php:19
string $client_id
Definition: class.ilias.php:36
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
run(Bucket $bucket)
This will add an Observer of the Task and start running the task.