Issue #2021933 by Crell, lz1irq: Catch exceptions from queue workers.
parent
281cda847e
commit
a521147255
|
@ -3247,9 +3247,16 @@ function drupal_cron_run() {
|
||||||
$end = time() + (isset($info['cron']['time']) ? $info['cron']['time'] : 15);
|
$end = time() + (isset($info['cron']['time']) ? $info['cron']['time'] : 15);
|
||||||
$queue = \Drupal::queue($queue_name);
|
$queue = \Drupal::queue($queue_name);
|
||||||
while (time() < $end && ($item = $queue->claimItem())) {
|
while (time() < $end && ($item = $queue->claimItem())) {
|
||||||
|
try {
|
||||||
call_user_func_array($callback, array($item->data));
|
call_user_func_array($callback, array($item->data));
|
||||||
$queue->deleteItem($item);
|
$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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Restore the user.
|
// Restore the user.
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
<?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.');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,7 @@
|
||||||
|
name: 'Cron Queue test'
|
||||||
|
type: module
|
||||||
|
description: 'Support module for the cron queue runner.'
|
||||||
|
package: Testing
|
||||||
|
version: VERSION
|
||||||
|
core: 8.x
|
||||||
|
hidden: true
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?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.');
|
||||||
|
}
|
Loading…
Reference in New Issue