3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation; either version 2 of the License, or
6 * (at your option) any later version.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * http://www.gnu.org/copyleft/gpl.html
21 use MediaWiki\Http\Telemetry
;
22 use MediaWiki\Page\PageReference
;
23 use MediaWiki\Page\PageReferenceValue
;
26 * Job queue task description base code.
30 * $job = new JobSpecification(
32 * [ 'lives' => 1, 'usleep' => 100, 'pi' => 3.141569 ],
33 * [ 'removeDuplicates' => 1 ]
35 * MediaWikiServices::getInstance()->getJobQueueGroup()->push( $job )
42 class JobSpecification
implements IJobSpecification
{
46 /** @var array Array of job parameters or false if none */
49 /** @var PageReference */
57 * @param array $params Map of key/values
58 * @param array $opts Map of key/values
59 * 'removeDuplicates' key - whether to remove duplicate jobs
60 * 'removeDuplicatesIgnoreParams' key - array with parameters to ignore for deduplication
61 * @param PageReference|null $page
63 public function __construct(
64 $type, array $params, array $opts = [], ?PageReference
$page = null
67 'requestId' => Telemetry
::getInstance()->getRequestId(),
69 $this->validateParams( $params );
70 $this->validateParams( $opts );
74 // Make sure JobQueue classes can pull the title from parameters alone
75 if ( $page->getDBkey() !== '' ) {
77 'namespace' => $page->getNamespace(),
78 'title' => $page->getDBkey()
82 // We aim to remove the page from job specification and all we need
83 // is namespace/dbkey, so use LOCAL no matter what.
84 $page = PageReferenceValue
::localReference( NS_SPECIAL
, 'Badtitle/' . __CLASS__
);
86 $this->params
= $params;
92 * @param array $params
94 protected function validateParams( array $params ) {
95 foreach ( $params as $p => $v ) {
96 if ( is_array( $v ) ) {
97 $this->validateParams( $v );
98 } elseif ( !is_scalar( $v ) && $v !== null ) {
99 throw new UnexpectedValueException( "Job parameter $p is not JSON serializable." );
104 public function getType() {
108 public function getParams() {
109 return $this->params
;
112 public function getReleaseTimestamp() {
113 return isset( $this->params
['jobReleaseTimestamp'] )
114 ?
wfTimestampOrNull( TS_UNIX
, $this->params
['jobReleaseTimestamp'] )
118 public function ignoreDuplicates() {
119 return !empty( $this->opts
['removeDuplicates'] );
122 public function getDeduplicationInfo() {
124 'type' => $this->getType(),
125 'params' => $this->getParams()
127 if ( is_array( $info['params'] ) ) {
128 // Identical jobs with different "root" jobs should count as duplicates
129 unset( $info['params']['rootJobSignature'] );
130 unset( $info['params']['rootJobTimestamp'] );
131 // Likewise for jobs with different delay times
132 unset( $info['params']['jobReleaseTimestamp'] );
133 // Identical jobs from different requests should count as duplicates
134 unset( $info['params']['requestId'] );
135 if ( isset( $this->opts
['removeDuplicatesIgnoreParams'] ) ) {
136 foreach ( $this->opts
['removeDuplicatesIgnoreParams'] as $field ) {
137 unset( $info['params'][$field] );
145 public function getRootJobParams() {
147 'rootJobSignature' => $this->params
['rootJobSignature'] ??
null,
148 'rootJobTimestamp' => $this->params
['rootJobTimestamp'] ??
null
152 public function hasRootJobParams() {
153 return isset( $this->params
['rootJobSignature'] )
154 && isset( $this->params
['rootJobTimestamp'] );
157 public function isRootJob() {
158 return $this->hasRootJobParams() && !empty( $this->params
['rootJobIsSelf'] );
162 * @deprecated since 1.41
163 * @return array Field/value map that can immediately be serialized
166 public function toSerializableArray() {
167 wfDeprecated( __METHOD__
, '1.41' );
169 'type' => $this->type
,
170 'params' => $this->params
,
171 'opts' => $this->opts
,
173 'ns' => $this->page
->getNamespace(),
174 'key' => $this->page
->getDBkey()
180 * @param array $map Field/value map
181 * @return JobSpecification
184 public static function newFromArray( array $map ) {
189 PageReferenceValue
::localReference( $map['title']['ns'], $map['title']['key'] )