Создание собственной отложенной задачи

Создание собственной отложенной задачи

от Денис Баженов -
Количество ответов: 6

Ubuntu Linux 22.04, Apache2, php7.4 Moodle 3.11

Хочу запускать время от времени задачку.

Возникло несколько вопросов:

  1.  Для adhoc задач необходим crontab?
  2. Если необходим то crontab надо натравливать на admin/cli/adhoc_task.php или достаточно admin/cli/cron.php

И ещё такая штука

создан файл задачи /local/greetings/classes/task/fart.php

namespace local_greetings\task;
defined('MOODLE_INTERNAL') || die();
// Пример выполнения подзадачи в отдельном потоке
class Fart extends \core\task\adhoc_task {
public function execute () { 
mtrace ( "Задача запущена ..." );
$i = 0; $i++;
mtrace ( "Задача завершена." ); 
}}

в главном файле модуля local/greetings/index.php пытаюсь создать задачу

// Создаём отложенную задачу
$task = new \local_greetings\task\Fart();
// добавить пользовательские данные
$task->set_custom_data ([
'context_id' => $context->id,
'text' => 'Трах - бабах!'
]);
// поставить в очередь
\core\task\manager :: queue_adhoc_task ( $task );

но выходит Исключение - Class 'local_greetings\task\Fart' not found

проблему решил добавив require_once ($CFG->dirroot.'/local/greetings/classes/task/fart.php');

Насколько я понимаю содержимое classes moodle должен подгружать автоматически. Нет?

И напоследок. Где и как можно проверить выполнилась задача или нет? В журнале задач никаких записей и упоминаний что была запущена такая задача нет. Надо понять где я могу посмотреть результат и как его можно формировать на основе собранных данных полученых в результате работы задачи.

Спасибо.

В ответ на Денис Баженов

Re: Создание собственной отложенной задачи

от Денис Баженов -
Да crontab необходим. Достаточно натравить на cli/cron.php Адхоки так же обрабатываются в общем потоке но не регистрируются в журнале задач.
crontab можно дополнительно натравливать на cli/adhoc_task.php для повышения скорости обработки Адхоков.
Но вопрос остаётся открытым почему-то адхок задача не обрабатывается но запись в таблице висит. Даже если запустить ручками, то выходит сообщение что не найдено ни одного Адхока.
Тем не менее checks.php видит задачу и показывает на проблему что задача не выполнялась большой промежуток времени более 4 часов.
В ответ на Денис Баженов

Re: Создание собственной отложенной задачи

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Adhoc это не регулярные задачи, а задачи по требованию - этакие асинхронные процессы, которые откладываются,чтобы быстрее дать ответ пользователю. Технические сделаны на базе планировщика, но для таких задач нет расписания, поэтому в планировщике не отображаются, но работают через cron. Запускать отдельно нет смысла, кроме очень нагруженных систем с долгим cron, так как и cron и adhoc будут запускаться раз в минуту.
А вот почему у вас не подхватывает обработчик - не понятно, может неправильно создали в коде adhoc задачу
В ответ на Vadim Dvorovenko

Re: Создание собственной отложенной задачи

от Денис Баженов -
Ну как неправильно? Пример выше привёл.
Задача в список добавилась - Добавилась.
checks.php её видит - Видит.

А вот обработчик крон adhoc_task.php не видит. Вот поэтому и возник вопрос как такое может быть?
В ответ на Денис Баженов

Re: Создание собственной отложенной задачи

от Денис Баженов -
Всем спасибо кто откликнулся. Проблема решена.
Оказывается нельзя создавать класс для adhoc задачи именуя его с заглавной буквы. Где-то происходит преобразование к строчным буквам и задача выпадает из списка по которому идёт сверка.
Странно конечно. Привычнее бы было класс именовать всё же с заглавной буквы.
В ответ на Денис Баженов

Re: Создание собственной отложенной задачи

от Vadim Dvorovenko -
Изображение пользователя Developers Изображение пользователя Майнтейнер перевода
Ну значит всё-таки неправильно в коде создали )))
Есть плагин https://moodle.org/plugins/local_codechecker , он проверяет требования к стилю кода moodle, в том числе эту проблему должен был бы подсветить. В некоторых местах требования к стилю кода продиктованы не только красотой, но и логикой работы moodle. В moodle все классы и файлы традиционно в нижнем регистре, чтобы меньше различий было между виндой и linux, где разное отношение к регистру файлов.

В нижний регистр принудительно никто не переводит. В \core\task\manager::adhoc_task_from_record проверяется class_exists, который использует autoloder. А autoloader ищет в файле Fart.php, а у вас файл называется fart.php. Отсюда и проблема