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タスクを使用したくありません。
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
class(cronサービスを実装するクラスです)。
Cronタスクでキューを処理する必要がない場合は、@QueueWorker
アノテーションを使用しないでください。
キューアイテムを使用するコードは、次のコードに似ています。 (コードはケースに固有です。)
$queue = \Drupal::service('queue')->get('adding_checklist');
while ($item = $queue->claimItem()) {
$node = $item->data[0];
// ...
$queue->deleteItem($item);
}
キューはコアを通じてcronによって処理されます。 DrushとDrupal Consoleを使用してキューアイテムを実行することもできます。
ドラッシュ:
drush queue:list
使用可能なキューを取得します。
drush queue:run
は、単一のアイテムを実行します。
drush queue:delete
キューをクリアします。
Drupalコンソール:
drupal debug:queue
を使用してキューをデバッグします。
drupal queue:run <name-of-the-queue>
単一のアイテムを実行します。