1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
<?php
namespace AutomateWoo\Jobs;
use AutomateWoo\Cron; use AutomateWoo\DateTime; use AutomateWoo\Jobs\Traits\ValidateItemAsIntegerId; use AutomateWoo\Queue_Query; use AutomateWoo\Queued_Event_Factory; use Exception;
defined( 'ABSPATH' ) || exit;
/** * Job to run queued workflow when they are scheduled to run. * * @since 5.1.0 */ class RunQueuedWorkflows extends AbstractRecurringBatchedActionSchedulerJob {
use ValidateItemAsIntegerId;
/** * Get the name of the job. * * @return string */ public function get_name() { return 'run_queued_workflows'; }
/** * Return the recurring job's interval in seconds. * * @since 6.0.0 * @return int The interval for the action in seconds */ public function get_interval(): int { return JobService::TWO_MINUTE_INTERVAL; }
/** * Can the job start. * * Because this job runs every 2 minutes this method is over-ridden here to prevent a create batch action from * being created every 2 minutes. * * @return bool Returns true if the job can start. */ protected function can_start(): bool { $query = ( new Queue_Query() ) ->set_ordering( 'date', 'ASC' ) ->where_date_due( new DateTime(), '<' ) ->where_failed( false );
if ( ! $query->has_results() ) { return false; }
return parent::can_start(); }
/** * Get a new batch of items. * * If no items are returned the job will stop. * * @param int $batch_number The batch number increments for each new batch in the a job cycle. * @param array $args The args for this instance of the job. * * @return int[] * @throws Exception If an error occurs. The exception will be logged by ActionScheduler. */ protected function get_batch( int $batch_number, array $args ) { $query = ( new Queue_Query() ) ->set_limit( $this->get_batch_size() ) ->set_ordering( 'date', 'ASC' ) ->where_date_due( new DateTime(), '<' ) ->where_failed( false );
return $query->get_results_as_ids(); }
/** * Process a single item. * * @param int $item A single item from the get_batch() method. Expects a validated item. * @param array $args The args for this instance of the job. * * @throws JobException When the item can't be processed. */ protected function process_item( $item, array $args ) { $queued_workflow = Queued_Event_Factory::get( $item );
if ( ! $queued_workflow ) { throw JobException::item_not_found(); }
// Double-check if the event is not marked as failed if ( $queued_workflow->is_failed() ) { throw new JobException( esc_html__( 'Queued workflow is already marked as failed.', 'automatewoo' ) ); }
$queued_workflow->run(); } }
|