15
Практика
1. В приложении предусмотрен механизм фоновых заданий,
но серверная часть обработки очереди отсутствует.
Напишите недостающие функции:
- take_task — получает очередное задание из очереди;
- complete_task — завершает обработку задания;
- process_tasks — основной цикл обработки заданий.
2. Запустите процедуру обработки очереди заданий в фоновом
режиме. Проверьте, что фоновые задания, поставленные
в очередь в приложении, выполняются, а результаты их
работы доступны для просмотра.
1. Фоновые задания позволяют запустить специально
зарегистрированную функцию из пользовательского интерфейса
и затем просматривать состояние и результат выполнения.
В качестве результата функция может возвращать множество строк,
т. е. в простейшем виде функция может быть написана на SQL
и содержать один SQL-запрос. На вход функция должна принимать
один параметр типа jsonb. Пример задания: public.greeting_program.
Напишите подпрограммы take_task, complete_task и process_tasks
по аналогии с показанными в демонстрации примерами. Учтите:
- take_task должна возвращать задачу в статусе «scheduled» и
заполнить подходящие поля таблицы tasks:
started = текущее время, status = «running», pid = номер процесса.
- complete_task должна не удалять задание, а заполнить поля tasks:
finished = текущее время,
при нормальном завершении: status = «finished», result = результат,
в случае ошибки: status = «error», result = сообщение об ошибке.
- process_tasks не должна завершаться; организуйте бесконечный
цикл с задержкой в 1 сек между задачами. Убедитесь, что в режиме
ожидания не возникает долгой транзакции. Для удобства установите
параметр application_name в значение «process_tasks».
Для фактического выполнения задания процедура должна вызвать
функцию empapi.run(task tasks). В случае успешного выполнения
функция вернет результат, оформленный в виде текстовой строки.
В случае ошибки будет сгенерировано исключение.