web-dev-qa-db-ja.com

cronタスクを使用せずにキューワーカーを実行する

hook_queue_info()を次のコードで実装しました。

function ecc_general_queue_info() {
  $queues = array();
  $queues['adding_checklist'] = array(
    'worker callback' => '_ecc_general_apply_queue',
    'time' => 60,
  );
  return $queues;
}

次のコードを使用して、キューのアイテムを作成します。

$queue_factory = \Drupal::service('queue');
$queue = $queue_factory->get('adding_checklist');
$queue->createItem([$node, 'insert']);

コールバック関数は以下です。

function _ecc_general_apply_queue($item) {
  // Some code here.
}

キュー内の各アイテムに対してこのコールバックを実行したいと思います。キューを処理して、各アイテムのワーカーコールバックを実行するにはどうすればよいですか?

キューの処理にcronタスクを使用したくありません。

1
Mohandes

Drupal 8はhook_queue_info()を使用しませんが、Drupalコアから取得した次のコードのように、 @QueueWorker アノテーションを使用してキュークラスに注釈を付けますモジュール。

/**
 * Updates a feed's items.
 *
 * @QueueWorker(
 *   id = "aggregator_feeds",
 *   title = @Translation("Aggregator refresh"),
 *   cron = {"time" = 60}
 * )
 */
class AggregatorRefresh extends QueueWorkerBase {

  /**
   * {@inheritdoc}
   */
  public function processItem($data) {
    if ($data instanceof FeedInterface) {
      $data
        ->refreshItems();
    }
  }

}

それはとにかく、一般的なキューの注釈ではなく、のキューでは Cron classcronサービスを実装するクラスです)。

Cronタスクでキューを処理する必要がない場合は、@QueueWorkerアノテーションを使用しないでください。

キューアイテムを使用するコードは、次のコードに似ています。 (コードはケースに固有です。)

$queue = \Drupal::service('queue')->get('adding_checklist');
while ($item = $queue->claimItem()) {
  $node = $item->data[0];
  // ...
  $queue->deleteItem($item);
}
1
kiamlaluno

キューはコアを通じてcronによって処理されます。 DrushとDrupal Consoleを使用してキューアイテムを実行することもできます。

ドラッシュ:

drush queue:list使用可能なキューを取得します。

drush queue:runは、単一のアイテムを実行します。

drush queue:deleteキューをクリアします。

Drupalコンソール:

drupal debug:queueを使用してキューをデバッグします。

drupal queue:run <name-of-the-queue>単一のアイテムを実行します。

2
Jaypan