Commit a5211472 authored by catch's avatar catch

Issue #2021933 by Crell, lz1irq: Catch exceptions from queue workers.

parent 281cda84
......@@ -3247,8 +3247,15 @@ function drupal_cron_run() {
$end = time() + (isset($info['cron']['time']) ? $info['cron']['time'] : 15);
$queue = \Drupal::queue($queue_name);
while (time() < $end && ($item = $queue->claimItem())) {
call_user_func_array($callback, array($item->data));
$queue->deleteItem($item);
try {
call_user_func_array($callback, array($item->data));
$queue->deleteItem($item);
}
catch (Exception $e) {
// In case of exception log it and leave the item in the queue
// to be processed again later.
watchdog_exception('cron', $e);
}
}
}
}
......
<?php
/**
* @file
* Contains Drupal\system\Tests\System\CronQueueTest.
*/
namespace Drupal\system\Tests\System;
use Drupal\Core\Database\Database;
use Drupal\Core\Queue\DatabaseQueue;
use Drupal\Core\Queue\Memory;
use Drupal\simpletest\DrupalUnitTestBase;
use Drupal\simpletest\WebTestBase;
/**
* Tests the handling of exceptions thrown by queue workers.
*/
class CronQueueTest extends WebTestBase {
/**
* The modules to enable.
*
* @var array
*/
public static $modules = array('cron_queue_test');
public static function getInfo() {
return array(
'name' => 'Cron Queue functionality',
'description' => 'Tests the Cron Queue runner.',
'group' => 'Queue',
);
}
/**
* Tests that exceptions thrown by workers are handled properly.
*/
public function testExceptions() {
$queue = $this->container->get('queue')->get('cron_queue_test_exception');
// Enqueue an item for processing.
$queue->createItem(array($this->randomName() => $this->randomName()));
// Run cron; the worker for this queue should throw an exception and handle
// it.
$this->cronRun();
// The item should be left in the queue.
$this->assertEqual($queue->numberOfItems(), 1, 'Failing item still in the queue after throwing an exception.');
}
}
name: 'Cron Queue test'
type: module
description: 'Support module for the cron queue runner.'
package: Testing
version: VERSION
core: 8.x
hidden: true
<?php
function cron_queue_test_queue_info() {
$queues['cron_queue_test_exception'] = array(
'title' => t('Exception test'),
'worker callback' => 'cron_queue_test_exception',
// Only needed if this queue should be processed by cron.
'cron' => array(
'time' => 60,
),
);
return $queues;
}
function cron_queue_test_exception($item) {
throw new Exception('That is not supposed to happen.');
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment