Вы здесь

Почему сбрасывается очередь?

0

Создаётся на основе примера Spleshka -и, простая очередь

/**
 * Implements hook_cron_queue_info().
 */
function synch_users_cron_queue_info() {
  $queue['synch_users_queue'] = array(
    'worker callback' => 'synch_users_item_process',
    'time' => 10,
  );
  return $queue;
}

/**
 * Implements hook_cron().
 */
function synch_users_cron() {
   watchdog("synch_users","Synch users cron");
  // Loading users data from external database
  $items = synch_users_load_data();

  if ($items) {
    // Create queue
    $queue = DrupalQueue::get('synch_users_queue');
    $number_of_items_in_queue = $queue->numberOfItems();
    watchdog("synch_users","Number of items: " . $number_of_items_in_queue);

    // Filling queue by items from external database
    foreach ($items as $item) {
      $queue->createItem($item);
      $number_of_items_in_queue = $queue->numberOfItems();
      watchdog("synch_users","Number of items after create item: " . $number_of_items_in_queue);
    }
  }
}
function synch_users_item_process($data) {
}

function synch_users_load_data() {
  $users = array(
    array(
      "login" => "JuravelNazar84",
      "email" => "JuravelNazar84@mail.ru",
      "personnel_number" => "023491"
    ),
    // ...
    array(
      "login" => "TarskayaDjuletta307",
      "email" => "TarskayaDjuletta307@mail.ru",
      "personnel_number" => "564123"
    ),
  );  
return $users;
}

Для логирования сделал следующее:
при создании очереди, сообщается в журнал текущее количество в очереди

$queue = DrupalQueue::get('synch_users_queue');
$number_of_items_in_queue = $queue->numberOfItems();
watchdog("synch_users","Number of items: " . $number_of_items_in_queue);

После чего из источника данных берутся элементы и добавляются в очередь, с каждым элементом, отображается текущее количество в очереди

$queue->createItem($item);
$number_of_items_in_queue = $queue->numberOfItems();
watchdog("synch_users","Number of items after create item: " . $number_of_items_in_queue);

Однако возможно я не верно понимаю принцип очередей, но я думал теперь очередь так и будет пополняться дальше, пока я либо не удалю её (deleteQueue) либо не удалю все элементы (deleteItem)
Однако при запуске крона, журнал вновь пишет как в самом начале, т.е. Number of items: 0
Как будто командой $queue = DrupalQueue::get('synch_users_queue'); он её сбрасывает вновь

Это так и задумано в принципе действия? Если да, то как можно поправить, чтобы не сбрасывал при каждом кроне?

Версия Drupal: 
7.x
Вопрос задан 04.12.2017 - 19:55

Ответы

0

Она не сбрасывается, а выполняется сразу после создания.

Ответ дан 04.12.2017 - 20:13
Аватар пользователя xandeadx
xandeadx
1471

Хммм... торможу
Сейчас у меня в журнале при каждом запуске крона следующее:

Cron run completed.
Number of items after create item: 10
Number of items after create item: 9
...
Number of items after create item: 2
Number of items after create item: 1
Number of items: 0
Synch users cron
Cron run completed.
Number of items after create item: 10
Number of items after create item: 9
...
Number of items after create item: 2
Number of items after create item: 1
Number of items: 0
Synch users cron

Однако я ожидал что с каждым кроном, количество будет дальше возрастать, а именно

Cron run completed.
Number of items after create item: 20
Number of items after create item: 19
...
Number of items after create item: 12
Number of items after create item: 11
Number of items: 10
Synch users cron
Cron run completed.
Number of items after create item: 10
Number of items after create item: 9
...
Number of items after create item: 2
Number of items after create item: 1
Number of items: 0
Synch users cron

Я так понял, что команда get она смотрит если очереди нет, то создает, если же есть то просто игнорируется
И получается у меня один и тот же цикл, который вроде как должен каждый раз новые элементы добавлять.

Комментарий оставлен 6 дней назад

Или погодите, имеете ввиду что на самом деле просто сразу по крону ещё колбэк очереди запускается, а раз там ничего нет, то моментально её обрабатывает, и получается очищает очередь, получается если бы у меня была бы гораздо больше очередь, или какая то уже обработка (которая заняло времени), то получается он часть бы уже обработал, и только частично очередь почистил

Комментарий оставлен 6 дней назад