SlideShare a Scribd company logo
1 of 13
Drupal 7
Работа с очередями
Зачем нужен Queue API

• Пакетная обработка
• Выполнение отложенных операции
    предотвратить блокировку API сервисами
    распределить нагрузку
• Импорт в определенной
  последовательности
Где реализуется Queue API

 Update               Batch
 module                API
              Queue
               API
 Aggregator
  module              Cron
Очередь
          Queue table
Типы Очередей Reliable и Non Reliable
/modules/system/system.queue.inc
Reliable
 место хранения: БД
 время жизни: несколько запросов
                                                 class BatchQueue extends SystemQueue
                             class SystemQueue implements DrupalReliableQueueInterface
                     interface DrupalReliableQueueInterface extends DrupalQueueInterface



Non-Reliable
 место хранения: память
 время жизни: один запрос
                                        class BatchMemoryQueue extends MemoryQueue
                                   class MemoryQueue implements DrupalQueueInterface
Как работать с Queue API
public DrupalQueueInterface::createQueue() {…}

public DrupalQueue::get()
public DrupalQueueInterface {
        public function createItem($data) {…}
        public function claimItem ($lease_time = 3600) {…}
        public function deleteItem($item) {…}
}
Queue example module
http://drupal.org/project/examples

Демонстрация:
http://localhost/tests/drupalcafe3/queue_example/insert_remove

          Insert: $queue->createItem($form_state['values']['string_to_add']);
          Claim: $item = $queue->claimItem($form_state['values']['claim_time']);
          Delete: $queue->deleteItem($item);
Пример работы
function drupal_cron_run() {
  module_invoke_all(‘cron_queue_info’);
   module_implements(‘cron’); // and invoke                                                               Анкета
                                                                         Проект
 …………………….                                                                                              - Статус =
$queue = DrupalQueue::get($queue_name);                                  - Факт
                                                                                                      ‘Сотрудник’
while (time() < $end && ($item = $queue->claimItem())) {
   $function($item->data);
   $queue->deleteItem($item);
}}



/**                                                     /**
 * Implements hook_cron_queue_info().                    * Implements hook_cron().
 */                                                      */
function project_plans_cron_queue_info() {              function project_plans_cron() {
  $queues['update_project_staff_info'] = array(           $interval = variable_get('project_plans_cron_interval', 60 * 60 * 24*14);
    'worker callback' => 'update_project_staff_info',     if (time() >= variable_get('project_plans_cron_next_ex', 0)) {
    'time' => 15,                                           $projects = project_api_projects_list();
  );                                                        $queue = DrupalQueue::get('update_project_staff_info');
  return $queues;                                           foreach ($projects as $project_nid) {
}                                                             $result = project_api_project_i($project_nid);
                                                              $queue->createItem($result[$project_nid]);
                                                            }
                                                            variable_set('project_plans_cron_next_ex', time() + $interval);
                                                          }
                                                        }
function update_project_staff_info($project_info) {
 $node = node_load($project_info->nid);
 $node->project_m_plan[LANGUAGE_NONE][0]['value'] = $project_info->PLAN;
 $node->project_m_fact[LANGUAGE_NONE][0]['value'] = $project_info->FACT;
 $node->project_m_route[LANGUAGE_NONE][0]['value'] = $project_info->ROUTE;

 // Make this change a new revision
 $node->revision = 1;
 $node->log = t('This node :node was programmatically updated at :date by project_plans module.
  Staff fact number - :fact. Staff plan number - :plan. Roate of staff - :route', array(
   ':node' => $project_info->nid,
   ':date' => date('c'),
   ':plan' => $project_info->PLAN,
   ':fact' => $project_info->FACT,
   ':route' => $project_info->ROUTE,
 ));

 node_save($node);

  watchdog('content', '@type: for %title node(:nid) was created a new revision.', array('@type' => $node->type, ':nid' => $node-
>nid, '%title' => $node->title));
}
Демонстрация
http://erp.retail-spb.ru/project/geyzer-regiony
Queue API – Drupal 8
core/includes/common.inc


Queue()
Core/lib/Drupal/Core/Queue

Batch
BatchMemory
DatabaseQueue
Memory
QueueDatabaseFactory
QueueFactory
QueueInterface
ReliableQueueInterface
Спасибо за внимание
• http://www.ent.iastate.edu/it/Batch_and_Queue.pdf
• http://www.hashbangcode.com/blog/drupal-7-queues-api-579.html
• http://rbayliss.net/drupal-queue-api
Вопросы
public DrupalQueueInterface::createQueue()

public DrupalQueue::get()

public DrupalQueueInterface::createItem($data)
public DrupalQueueInterface::claimItem ($lease_time = 3600)
public DrupalQueueInterface::deleteItem($item)


hook_cron()
hook_cron_queue_info()

More Related Content

Viewers also liked

Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologie
contentrepublic
 

Viewers also liked (14)

An introduction to digital health surveillance from online user-generated con...
An introduction to digital health surveillance from online user-generated con...An introduction to digital health surveillance from online user-generated con...
An introduction to digital health surveillance from online user-generated con...
 
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 |  Shazam, Alexey OvcharovTargetSummit Moscow Late 2016 |  Shazam, Alexey Ovcharov
TargetSummit Moscow Late 2016 | Shazam, Alexey Ovcharov
 
Patch Management
Patch ManagementPatch Management
Patch Management
 
Piezoelectric sens0 r
Piezoelectric sens0 rPiezoelectric sens0 r
Piezoelectric sens0 r
 
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
DFB2B 2016- Mogelijkheden vandaag de dag in B2B zijn ongekend.
 
Проект "Збережемо природу разом"
Проект   "Збережемо природу разом" Проект   "Збережемо природу разом"
Проект "Збережемо природу разом"
 
Measuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivityMeasuring and evaluating port performance and productivity
Measuring and evaluating port performance and productivity
 
Friction in orthodontics
Friction in orthodonticsFriction in orthodontics
Friction in orthodontics
 
Saliva (2)
Saliva (2)Saliva (2)
Saliva (2)
 
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview MistakesJoseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
Joseph Jacob Esther Attorney Jefferson City Missouri: Top 10 Interview Mistakes
 
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...orthodontic Brackets  /certified fixed orthodontic courses by Indian dental a...
orthodontic Brackets /certified fixed orthodontic courses by Indian dental a...
 
Feasibility study format
Feasibility study formatFeasibility study format
Feasibility study format
 
[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams[Russian] Team Canvas + On Culture and Teams
[Russian] Team Canvas + On Culture and Teams
 
Content Republic Methodologie
Content Republic MethodologieContent Republic Methodologie
Content Republic Methodologie
 

More from DrupalSPB

More from DrupalSPB (20)

Мониторинг Drupal-сайтов
Мониторинг Drupal-сайтовМониторинг Drupal-сайтов
Мониторинг Drupal-сайтов
 
Если не Drupal 8, то что? Обзор Laravel 5
Если не Drupal 8, то что? Обзор Laravel 5Если не Drupal 8, то что? Обзор Laravel 5
Если не Drupal 8, то что? Обзор Laravel 5
 
Headless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и ReactHeadless Drupal на примере Drupal 8 и React
Headless Drupal на примере Drupal 8 и React
 
Проблематика взаимодействия между исполнителем и заказчиком
Проблематика взаимодействия между исполнителем и заказчикомПроблематика взаимодействия между исполнителем и заказчиком
Проблематика взаимодействия между исполнителем и заказчиком
 
Кто такой хороший Drupal-разработчик
Кто такой хороший Drupal-разработчикКто такой хороший Drupal-разработчик
Кто такой хороший Drupal-разработчик
 
Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7Сервис емейл рассылок на Drupal 7
Сервис емейл рассылок на Drupal 7
 
Темизация и Twig в Drupal 8
Темизация и Twig в Drupal 8Темизация и Twig в Drupal 8
Темизация и Twig в Drupal 8
 
Drupal 8 API для разработчиков
Drupal 8 API для разработчиковDrupal 8 API для разработчиков
Drupal 8 API для разработчиков
 
Drupal 8 и хостинг
Drupal 8 и хостингDrupal 8 и хостинг
Drupal 8 и хостинг
 
Знакомство с Drupal 8
Знакомство с Drupal 8Знакомство с Drupal 8
Знакомство с Drupal 8
 
Никита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗНикита Ремизов - Введение в разработку ТЗ
Никита Ремизов - Введение в разработку ТЗ
 
Василий Устинов - Drupal + Drush
Василий Устинов - Drupal + DrushВасилий Устинов - Drupal + Drush
Василий Устинов - Drupal + Drush
 
Олег Сосорев - Эффективное формирование и расширение архитектуры ПО
Олег Сосорев - Эффективное формирование и расширение архитектуры ПООлег Сосорев - Эффективное формирование и расширение архитектуры ПО
Олег Сосорев - Эффективное формирование и расширение архитектуры ПО
 
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
Martin Mayer - My fellow developers, ask not only what your Drupal can do for...
 
Андрей Юртаев - Improve theming with (Twitter) Bootstrap
Андрей Юртаев - Improve theming with (Twitter) BootstrapАндрей Юртаев - Improve theming with (Twitter) Bootstrap
Андрей Юртаев - Improve theming with (Twitter) Bootstrap
 
Никита Ремизов - Случай использования Drupal как ERP системы
Никита Ремизов - Случай использования Drupal как ERP системыНикита Ремизов - Случай использования Drupal как ERP системы
Никита Ремизов - Случай использования Drupal как ERP системы
 
Павел Прищепа - Drupal хостинг полного цикла
Павел Прищепа - Drupal хостинг полного циклаПавел Прищепа - Drupal хостинг полного цикла
Павел Прищепа - Drupal хостинг полного цикла
 
Чингис Санданов - Drupal как решение для госсектора
Чингис Санданов - Drupal как решение для госсектораЧингис Санданов - Drupal как решение для госсектора
Чингис Санданов - Drupal как решение для госсектора
 
Алексей Колосов - Drupal для хостинга
Алексей Колосов - Drupal для хостингаАлексей Колосов - Drupal для хостинга
Алексей Колосов - Drupal для хостинга
 
Развитие идеи Проекта Мечты
Развитие идеи Проекта МечтыРазвитие идеи Проекта Мечты
Развитие идеи Проекта Мечты
 

Recently uploaded

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 

Recently uploaded (20)

Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​Elevate Developer Efficiency & build GenAI Application with Amazon Q​
Elevate Developer Efficiency & build GenAI Application with Amazon Q​
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
WSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering DevelopersWSO2's API Vision: Unifying Control, Empowering Developers
WSO2's API Vision: Unifying Control, Empowering Developers
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)Introduction to Multilingual Retrieval Augmented Generation (RAG)
Introduction to Multilingual Retrieval Augmented Generation (RAG)
 
Exploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with MilvusExploring Multimodal Embeddings with Milvus
Exploring Multimodal Embeddings with Milvus
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 

DrupalCafe #3: Никита Ремизов - Drupal 7 - Работа с очередями

  • 1. Drupal 7 Работа с очередями
  • 2. Зачем нужен Queue API • Пакетная обработка • Выполнение отложенных операции предотвратить блокировку API сервисами распределить нагрузку • Импорт в определенной последовательности
  • 3. Где реализуется Queue API Update Batch module API Queue API Aggregator module Cron
  • 4. Очередь Queue table
  • 5. Типы Очередей Reliable и Non Reliable /modules/system/system.queue.inc Reliable место хранения: БД время жизни: несколько запросов class BatchQueue extends SystemQueue class SystemQueue implements DrupalReliableQueueInterface interface DrupalReliableQueueInterface extends DrupalQueueInterface Non-Reliable место хранения: память время жизни: один запрос class BatchMemoryQueue extends MemoryQueue class MemoryQueue implements DrupalQueueInterface
  • 6. Как работать с Queue API public DrupalQueueInterface::createQueue() {…} public DrupalQueue::get() public DrupalQueueInterface { public function createItem($data) {…} public function claimItem ($lease_time = 3600) {…} public function deleteItem($item) {…} }
  • 7. Queue example module http://drupal.org/project/examples Демонстрация: http://localhost/tests/drupalcafe3/queue_example/insert_remove Insert: $queue->createItem($form_state['values']['string_to_add']); Claim: $item = $queue->claimItem($form_state['values']['claim_time']); Delete: $queue->deleteItem($item);
  • 8. Пример работы function drupal_cron_run() { module_invoke_all(‘cron_queue_info’); module_implements(‘cron’); // and invoke Анкета Проект ……………………. - Статус = $queue = DrupalQueue::get($queue_name); - Факт ‘Сотрудник’ while (time() < $end && ($item = $queue->claimItem())) { $function($item->data); $queue->deleteItem($item); }} /** /** * Implements hook_cron_queue_info(). * Implements hook_cron(). */ */ function project_plans_cron_queue_info() { function project_plans_cron() { $queues['update_project_staff_info'] = array( $interval = variable_get('project_plans_cron_interval', 60 * 60 * 24*14); 'worker callback' => 'update_project_staff_info', if (time() >= variable_get('project_plans_cron_next_ex', 0)) { 'time' => 15, $projects = project_api_projects_list(); ); $queue = DrupalQueue::get('update_project_staff_info'); return $queues; foreach ($projects as $project_nid) { } $result = project_api_project_i($project_nid); $queue->createItem($result[$project_nid]); } variable_set('project_plans_cron_next_ex', time() + $interval); } }
  • 9. function update_project_staff_info($project_info) { $node = node_load($project_info->nid); $node->project_m_plan[LANGUAGE_NONE][0]['value'] = $project_info->PLAN; $node->project_m_fact[LANGUAGE_NONE][0]['value'] = $project_info->FACT; $node->project_m_route[LANGUAGE_NONE][0]['value'] = $project_info->ROUTE; // Make this change a new revision $node->revision = 1; $node->log = t('This node :node was programmatically updated at :date by project_plans module. Staff fact number - :fact. Staff plan number - :plan. Roate of staff - :route', array( ':node' => $project_info->nid, ':date' => date('c'), ':plan' => $project_info->PLAN, ':fact' => $project_info->FACT, ':route' => $project_info->ROUTE, )); node_save($node); watchdog('content', '@type: for %title node(:nid) was created a new revision.', array('@type' => $node->type, ':nid' => $node- >nid, '%title' => $node->title)); }
  • 11. Queue API – Drupal 8 core/includes/common.inc Queue() Core/lib/Drupal/Core/Queue Batch BatchMemory DatabaseQueue Memory QueueDatabaseFactory QueueFactory QueueInterface ReliableQueueInterface
  • 12. Спасибо за внимание • http://www.ent.iastate.edu/it/Batch_and_Queue.pdf • http://www.hashbangcode.com/blog/drupal-7-queues-api-579.html • http://rbayliss.net/drupal-queue-api
  • 13. Вопросы public DrupalQueueInterface::createQueue() public DrupalQueue::get() public DrupalQueueInterface::createItem($data) public DrupalQueueInterface::claimItem ($lease_time = 3600) public DrupalQueueInterface::deleteItem($item) hook_cron() hook_cron_queue_info()

Editor's Notes

  1. Я бы хотел поговорить немного о том, что такое очереди,где икак они используются в Drupal. Продемонстрировать каким образом возможно использовать систему очередей в собственном модуле.
  2. Зачем же вообще нужны очереди, откуда они берутся? В каких задачах может потребоваться использовать систему очередей?1. В случаях когда требуется пакетная обработка данных. Т.е. требуется выполнение сразу нескольких действий, то возможно поместить эти элементы в очередь, используя Batch API. Кто использовать Batch API знает метод batch_set($operation), где в качестве аргумента передается информация о действиях, которые необходимо выполнить.Например, мы хотим при создании ноды одного типа, создать еще несколько дополнительных нод другого типа.2. Требуется в случая обработки большого кол-ва информации, например обработать статистическую информацию, количество заказов в интернет магазине по всем продуктам. Мы бы могли использовать систему очередей для того, чтобы разбить задачу по частям и выбрать оптимальное время для выполнения операции. Поскольку система позволяет откладывать операции, то как следствие её можно использовать для предотвращения банаAPI сервисами – типоTwitter API, распределяя кол-во выполненных запросов.// На прошлом DrupalCafeдокладчик (Виктор Григорьев) рассказывал о создании модуля, в котором //производилось обновление перевода всех модулей сайта, задачу такого рода тоже можно решить с //помощью очередей, разбив задачу по частям и распределив нагрузку.3. С помощью очередей можно соблюдать строгую последовательность выполняющихся задач. Т.о. можно быть уверенным что вы сможете импортировать словарь таксономией с иерархией, потому что родительский термин будет добавлен раньше, чем связанные с ним термины.(посчитать сколько сотрудников работает на проекте. Или предположим мы хотим раз в неделю информировать всех пользователей нашего супер посещаемого сайта, о новых статья за неделю. )
  3. И так где же реализуется работа с очередями в Drupal.Batch API – построен на основе Queue API, и предоставляет модифицированные классы очередей, о нем я уже упомянул.Cron – использует Queue API, позволяют другим модулям с помощью хуков добавлять собственные элементы очередей и обрабатывать их. В свою очередь эти хуки использует модуль аггрегатор для обновления RSS лент, и именно основываясь на этих хуках позже я покажу как сделать простейший модуль.Модуль Обновлений, создает очередь из задач на сбор информации об обновлениях.Давайте теперь определимся, что же мы понимаем здесь очередью.
  4. О́чередь — структура данных, (с правилам доступа) с дисциплиной доступа к элементам «первый пришёл — первый вышел» (FIFO, FirstIn — FirstOut). Добавление элемента (принято обозначать словом enqueue — поставить в очередь) возможно лишь в конец очереди, выборка — только из начала очереди (что принято называть словом dequeue — убрать из очереди), при этом выбранный элемент из очереди удаляется.В Drupalэлементы Системной Очереди хранятся в таблице queue, но не для всех очередей это справедливо. (что не обязательно, если вы используете пользовательский класс очереди, которые могут хранить свои данные в папке или своей таблице или Non-reliable очереди, которые хранятся в памяти)Таблица состоит из 5 колонок, ID, имя очереди, данные в произвольной форме, необходимой для выполнения задачи, а также метки времени создания и снятия блокировки (аренды)
  5. Почему же не все очереди хранятся в этой таблице?В drupalсуществует два типа очереди надежнаяи не надежная. Главные отличия заключаются в том, что надежная очередь хранит свои элементы в базе данных, а не надежная нет. И как следствие надежная очередь может проходить через несколько запросов, а не надежная обрабатывает все элементы за один.Надежная очередь гарантирует, что каждый элемент будет обработан хотя бы один раз и сохраняет порядок очереди. Не надежная может не соблюдать порядка, а так же может потерять часть элементов, но поскольку запись идет в память то она может справиться с гораздо большим количеством инсертов.Примерами классов надежной очереди является:SystemQueueBatchQueueЕдинственным способом показать Druapal, что ваш пользовательский класс создает надежную очередь, это использовать DrupalReliableQueueInterfaceНе надежные:MemoryQueueBatchMemoryQueue
  6. Рассмотрим основные методы интерфейса DrupalQueueInterfaceсоздание очереди, этот метод вызывается при инициализации очереди, создает таблицы и папки куда будут записываться элементы очереди.Для добавления элемента в очередьиспользуем createItem, где аргументом функции являются данные в произвольной форме, которые будут связаны с задачей в очереди.Далее методclaimItem, который утверждает элемент на обработку и в качестве аргумента функции, выступает время аренды, т.е. это время которое предоставляется обработчику элемента, после которого элемент будет предоставлен другому обработчику или удален. Последний метод – удаление элемента, аргументов является элемент для удаления, после возврата claimItem.Для получения объекта очереди используем класс DrupalQueue c единственным публичным статическим методом get().
  7. Давайте наглядно посмотрим как работа с этими методами выглядит в базе данных. Для этих целей я установил модуль queue example module, который очень хорошо иллюстрирует эти методы. И так, мы можем создать запись в очереди, давайте так и сделаем. Видите в таблице queue – появилась наша запись. Теперь представим, что некоторый процесс хочет обработать данный элемент, тогда он должен забронировать его, мы можем здесь выбрать время за которое планируется выполнение операции. После выполнения, которого элемент в очереди удаляется.
  8. Задача;Создана нода типа Проект и нода типа Анкета. В проекте хранится фактическое кол-во человек работающих на проекте. Анкета имеет поле – статус, нам необходимо учитывать только анкеты со статусом сотрудники связанных с проектом.Нам надо посчитать сколько анкет имеют статус – сотрудник, на каждом проекте, после чего записать новое значение фактического количества сотрудников на проекте и создать ревизию проектов. Для этого воспользуемся хуками hook_cronи hook_cron_queue_info.Два этих хука вызваются внутри функции drupal_cron_run, первым делом модули опрашиваются на наличие хука hook_cron_queue. Он должен вернуть массив, описывающий пользовательскую очередь, а именно обработчик элементов очереди и время, которое Drupal Должен потратить на работу в обработчике элементов. В моем случае обработчик имеет название update_project_staff_infoи время на выполнение 15 секунд.Далее управление передается hook_cron, в котором я получаю информацию о проектах и сотрудниках на них, после чего записываю это информацию в очередь, каждый проект это один элемент очереди. Далее drupal_cron_run()получает объект моей пользовательской очереди, и начинает обрабатывать элементы моей очереди удаляя, полученный элемент
  9. Так выглядит обработчик элементов очереди, на вход функции подается элемент очереди. Здесь и происходит создание ревизии ноды.Вот и все, так просто, в результате мы можем работать с этой статистической информацией, например видеть текучесть персонала на проекте с течение времени… смотри erp.retail-spb.ru
  10. Модули улучшающиеQueueJob Scheduler – Дополнительное APIElysiaCron – Интерфейс для ОчередейQueue UI – просмотр очередей
  11. ВDrupal 8 основные методы работы с очередями останутся такими же, но API будет уже храниться в Core/lib/Drupal/Core/Queue. В файле core/includes/common.inc будет хранится только функция queue – для кэширования и создания экземпляров очереди.
  12. Для подготовки к докладу использовались другие презентации, они более подробные и если кого то заинтересовала эта тема, то советую ознакомится с этим ссылками.