Queue no Drupal 8

Queue no Drupal 8 são ações que são executadas via cron.

As vantagens de se utiliziar Queue para executar essas ações são: performance e possíbilidade de agendamento.
Uma vez que você tem uma ação com um longo tempo de execução, correndo o risco de timeout, você pode utilizar Queue e deixar que a cron fique encarregada de executa-lá.

Veja abaixo, como implementar uma Queue:

IMPLEMENTANDO UMA CUSTOM QUEUE

Dentro do seu módulo custom, crie o seguinte arquivo com o código abaixo: <modulo-name>/src/Plugin/QueueWorker/MyCustomQueue.php

<?php

namespace Drupal\custom_queue\Plugin\QueueWorker;

use Drupal\Core\Queue\QueueWorkerBase;

/**
 * Processes Tasks for Learning.
 *
 * @QueueWorker(
 *   id = "custom_queue",
 *   title = @Translation("Learning task worker: custom queue"),
 *   cron = {"time" = 90}
 * )
 */
class MyCustomQueue extends QueueWorkerBase {

  /**
   * {@inheritdoc}
   */
  public function processItem($data) {
    /**
     * Here you do something to be executed by cron !
    */
    $msg = $data['msg'];
    drupal_set_message($msg);
   
    \Drupal::logger('cron')->notice('Custom queue: ' . $msg);
  }

}

Dentro do método "processItem" é onde fica a ação que será executada via cron.
Neste exemplo, irei somente exibir uma mensagem.

O próximo passo será criar um formulário simples, onde vou informar a mesagem que será exibida e adicionar está ação ao meu custom Queue.

IMPLEMENTANDO O FORMULÁRIO

Crie o seguinte formulário com o código abaixo: <modulo-name>/src/Form/AddActionForm.php
Dica: Utilize o Drupal Console para gerar o formulário.

<?php

namespace Drupal\custom_queue\Form;

use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Queue\QueueFactory;

/**
 * Class AddActionForm.
 *
 * @package Drupal\custom_queue\Form
 */
class AddActionForm extends FormBase {

  /**
   * The queue object.
   *
   * @var \Drupal\Core\Queue\QueueFactory
   */
  protected $queueFactory;

  /**
   * Constructor.
   *
   * @param \Drupal\Core\Queue\QueueFactory $queue_factory
   *   Queue factory service to get new/existing queues for use.
   */
  public function __construct(QueueFactory $queue_factory) {
    $this--->queueFactory = $queue_factory;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static($container->get('queue'));
  }

  /**
   * {@inheritdoc}
   */
  public function getFormId() {
    return 'add_action_form';
  }

  /**
   * {@inheritdoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form['message'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Message'),
      '#maxlength' => 64,
      '#size' => 64,
      '#required' => TRUE,
    ];
    $form['submit'] = [
      '#type' => 'submit',
      '#value' => $this->t('Submit'),
    ];

    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateForm(array &$form, FormStateInterface $form_state) {
    parent::validateForm($form, $form_state);
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    //Get message value
    $data['msg'] = $form_state->getValue('message');

    //Create queue "custom_queue"
    $queue = $this->queueFactory->get('custom_queue', FALSE);
    $queue->createQueue();
    $queue->createItem($data);
    //Claim item time if necessary
    //$queue->claimItem(90);

  }

}

Criado o formulário, acesse sua URL (gerada no momento de criar o Form via Drupal Console), e adicione uma mensagem.
Repare que no método "submitForm" é onde eu adiciono minha ação (que no caso é exibir uma mensagem) na minha custom Queue.

Feito isso, na próxima vez que o cron for executado a mensagem será exibida.

Faça aqui o download do módulo utilizado como exemplo.

Espero que tenha ajudado.
Até o próximo tutorial!

Login do usuário