web-dev-qa-db-ja.com

cronを取得して、特定の時間にQueueWorkerアイテムを処理する

1日を通して作成/更新されるノードから送信する電子メールのキューを作成する_Plugin\QueueWorker_があります。 processItem()メソッドと、mymodule_add_to_queue()を実行してノードをキューに追加する任意の関数($queue->createItem()と呼びましょう)を定義しました。 cronが実行されると、キュー内のすべてのアイテムが実行されます。

唯一の問題は、cronが1時間ごとに実行され、QueueWorkerクラスが毎回プロセスを実行するように見えることです。

_REQUEST_TIME_と最後に実行されたときの状態などをチェックするコードがありますが、どこに置くかわかりません。 hook_cron()に入っても、デフォルトの動作に違いはないようです。

私がどのようなことを期待しているのかという疑似コードは次のとおりです。

_<?php

// @file src/Plugin/QueueWorker/MyModuleCronQueueWorkerEmailSend.php
class MyModuleCronQueueWorkerEmailSend extends QueueWorkerBase {
  public function __construct () {
    this.auto_cron = FALSE;
  }
  public function processItem() {
    doSomething();
  }
}

// @file mymodule.module
function mymodule_add_to_queue() {
  $queue = \Drupal::queue('mymodule_queue_worker_email_send');
  $queue->createItem(['foo' => 'bar']);
}

function mymodule_cron() {
  if (some_cron_conditionals()) {
    $queue = \Drupal::queue('mymodule_queue_worker_email_send');
    $queue->process();
  }
}
_

...これは完全に範囲外かもしれません、または私が見逃している本当に明白な他の方法があるかもしれません。何かご意見は?いつものように、事前に感謝します:)

4
Matt Fletcher

アノテーション\Drupal\Core\Annotation\QueueWorkerからコピーされ、@ QueueWorkerアノテーションがドキュメント化されている場所に配置されます。

 * Worker plugins are used by some queues for processing the individual items
 * in the queue. In that case, the ID of the worker plugin needs to match the
 * machine name of a queue, so that you can retrieve the queue back end by
 * calling \Drupal\Core\Queue\QueueFactory::get($plugin_id).
 *
 * \Drupal\Core\Cron::processQueues() processes queues that use workers; they
 * can also be processed outside of the cron process.
 *
 * Some queues do not use worker plugins: you can create queues, add items to
 * them, claim them, etc. without using a QueueWorker plugin. However, you will
 * need to take care of processing the items in the queue in that case. You can
 * look at \Drupal\Core\Cron::processQueues() for an example of how to process
 * a queue that uses workers, and adapt it to your queue.

最後の段落を参照してください。解決策は、任意のキューを埋めて、必要なときにアイテムを処理するキューのCron :: processQueues()と同様のロジックを実装することです。ワーカープラグインがないキューのアイテムでは、自動的には何も起こりません。

プラグインの代わりに、サービスにログインを実装して、独自のcron実装からそれを呼び出すことができます。

2
Berdir

https://www.drupal.org/project/ultimate_cron を使用してみてください。これにより、各cronタスクの実行時期をきめ細かく制御できます。

0
Tolu Laleye