Automattic\WooCommerce\Internal\BatchProcessing
BatchProcessingController::remove_or_retry_failed_processors
Hooked onto 'shutdown'. This cleanup routine checks enqueued processors and whether they are scheduled or not to either re-eschedule them or remove them from the queue. This prevents stale states where Action Scheduler won't schedule any more attempts but we still report the processor as enqueued.
Метод класса: BatchProcessingController{}
Хуков нет.
Возвращает
null. Ничего (null).
Использование
// private - только в коде основоного (родительского) класса $result = $this->remove_or_retry_failed_processors(): void;
Список изменений
| С версии 9.1.0 | Введена. |
Код BatchProcessingController::remove_or_retry_failed_processors() BatchProcessingController::remove or retry failed processors WC 10.4.2
private function remove_or_retry_failed_processors(): void {
if ( ! did_action( 'wp_loaded' ) ) {
return;
}
$last_error = error_get_last();
if ( ! is_null( $last_error ) && in_array( $last_error['type'], array( E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ), true ) ) {
return;
}
// The most efficient way to check for an existing action is to use `as_has_scheduled_action`, but in unusual
// cases where another plugin has loaded a very old version of Action Scheduler, it may not be available to us.
$has_scheduled_action = function_exists( 'as_has_scheduled_action') ? 'as_has_scheduled_action' : 'as_next_scheduled_action';
if ( call_user_func( $has_scheduled_action, self::WATCHDOG_ACTION_NAME ) ) {
return;
}
$enqueued_processors = $this->get_enqueued_processors();
$unscheduled_processors = array_diff( $enqueued_processors, array_filter( $enqueued_processors, array( $this, 'is_scheduled' ) ) );
foreach ( $unscheduled_processors as $processor ) {
try {
$instance = $this->get_processor_instance( $processor );
} catch ( \Exception $e ) {
continue;
}
$exception = new \Exception( 'Processor is enqueued but not scheduled. Background job was probably killed or marked as failed. Reattempting execution.' );
$this->update_processor_state( $instance, 0, $exception );
$this->log_error( $exception, $instance, array() );
if ( $this->is_consistently_failing( $instance ) ) {
$this->log_consistent_failure( $instance, $this->get_process_details( $instance ) );
$this->remove_processor( $processor );
} else {
$this->schedule_batch_processing( $processor, true );
}
}
}