Skip to content

Commit 29e3778

Browse files
committed
Alter dequeue - now accepting 'args' and "ID" arguments
1 parent 4a97c14 commit 29e3778

File tree

4 files changed

+121
-4
lines changed

4 files changed

+121
-4
lines changed

README.md

+10-1
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,17 @@ class My_Job
139139
This method can be used to conveniently remove a job from a queue.
140140

141141
```php
142-
// Removes 'My_Job' of queue 'default'
142+
// Removes job class 'My_Job' of queue 'default'
143143
Resque::dequeue('default', ['My_Job']);
144+
145+
// Removes job class 'My_Job' with Job ID '087df5819a790ac666c9608e2234b21e' of queue 'default'
146+
Resuque::dequeue('default', ['My_Job' => '087df5819a790ac666c9608e2234b21e']);
147+
148+
// Removes job class 'My_Job' with arguments of queue 'default'
149+
Resque::dequeue('default', ['My_Job' => array('foo' => 1, 'bar' => 2)]);
150+
151+
// Removes multiple jobs
152+
Resque::dequeue('default', ['My_Job', 'My_Job2']);
144153
```
145154

146155
If no jobs are given, this method will dequeue all jobs matching the provided queue.

lib/Resque.php

+38-2
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ private static function removeItems($queue, $items = Array())
257257
$string = self::redis()->rpoplpush($originalQueue, self::redis()->getPrefix() . $tempQueue);
258258

259259
if(!empty($string)) {
260-
$decoded = json_decode($string, true);
261-
if(in_array($decoded['class'], $items)) {
260+
if(self::matchItem($string, $items)) {
262261
$counter++;
263262
} else {
264263
self::redis()->rpoplpush($tempQueue, self::redis()->getPrefix() . $requeueQueue);
@@ -284,6 +283,43 @@ private static function removeItems($queue, $items = Array())
284283
return $counter;
285284
}
286285

286+
/**
287+
* matching item
288+
* item can be ['class'] or ['class' => 'id'] or ['class' => {:foo => 1, :bar => 2}]
289+
* @private
290+
*
291+
* @params string $string redis result in json
292+
* @params $items
293+
*
294+
* @return (bool)
295+
*/
296+
private static function matchItem($string, $items)
297+
{
298+
$decoded = json_decode($string, true);
299+
300+
foreach($items as $key => $val) {
301+
# class name only ex: item[0] = ['class']
302+
if (is_numeric($key)) {
303+
if($decoded['class'] == $val) {
304+
return true;
305+
}
306+
# class name with args , example: item[0] = ['class' => {'foo' => 1, 'bar' => 2}]
307+
} elseif (is_array($val)) {
308+
$decodedArgs = (array)$decoded['args'][0];
309+
if ($decoded['class'] == $key &&
310+
count($decodedArgs) > 0 && count(array_diff($decodedArgs, $val)) == 0) {
311+
return true;
312+
}
313+
# class name with ID, example: item[0] = ['class' => 'id']
314+
} else {
315+
if ($decoded['class'] == $key && $decoded['id'] == $val) {
316+
return true;
317+
}
318+
}
319+
}
320+
return false;
321+
}
322+
287323
/**
288324
* Remove List
289325
*

lib/Resque/Redis.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ class Resque_Redis
7777
'zscore',
7878
'zremrangebyscore',
7979
'sort',
80-
'rename'
80+
'rename',
8181
'rpoplpush'
8282
);
8383
// sinterstore

test/Resque/Tests/JobTest.php

+72
Original file line numberDiff line numberDiff line change
@@ -253,4 +253,76 @@ public function testDequeueNonExistingItem2()
253253
$this->assertEquals(Resque::size($queue), 2);
254254
}
255255

256+
public function testDequeueItemID()
257+
{
258+
$queue = 'jobs';
259+
Resque::enqueue($queue, 'Test_Job_Dequeue');
260+
$qid = Resque::enqueue($queue, 'Test_Job_Dequeue');
261+
$this->assertEquals(Resque::size($queue), 2);
262+
$test = array('Test_Job_Dequeue' => $qid);
263+
$this->assertEquals(Resque::dequeue($queue, $test), 1);
264+
$this->assertEquals(Resque::size($queue), 1);
265+
}
266+
267+
public function testDequeueWrongItemID()
268+
{
269+
$queue = 'jobs';
270+
Resque::enqueue($queue, 'Test_Job_Dequeue');
271+
$qid = Resque::enqueue($queue, 'Test_Job_Dequeue');
272+
$this->assertEquals(Resque::size($queue), 2);
273+
#qid right but class name is wrong
274+
$test = array('Test_Job_Dequeue1' => $qid);
275+
$this->assertEquals(Resque::dequeue($queue, $test), 0);
276+
$this->assertEquals(Resque::size($queue), 2);
277+
}
278+
279+
public function testDequeueWrongItemID2()
280+
{
281+
$queue = 'jobs';
282+
Resque::enqueue($queue, 'Test_Job_Dequeue');
283+
$qid = Resque::enqueue($queue, 'Test_Job_Dequeue');
284+
$this->assertEquals(Resque::size($queue), 2);
285+
$test = array('Test_Job_Dequeue' => 'r4nD0mH4sh3dId');
286+
$this->assertEquals(Resque::dequeue($queue, $test), 0);
287+
$this->assertEquals(Resque::size($queue), 2);
288+
}
289+
290+
public function testDequeueItemWithArg()
291+
{
292+
$queue = 'jobs';
293+
$arg = array('foo' => 1, 'bar' => 2);
294+
Resque::enqueue($queue, 'Test_Job_Dequeue9');
295+
Resque::enqueue($queue, 'Test_Job_Dequeue9', $arg);
296+
$this->assertEquals(Resque::size($queue), 2);
297+
$test = array('Test_Job_Dequeue9' => $arg);
298+
$this->assertEquals(Resque::dequeue($queue, $test), 1);
299+
#$this->assertEquals(Resque::size($queue), 1);
300+
}
301+
302+
public function testDequeueItemWithUnorderedArg()
303+
{
304+
$queue = 'jobs';
305+
$arg = array('foo' => 1, 'bar' => 2);
306+
$arg2 = array('bar' => 2, 'foo' => 1);
307+
Resque::enqueue($queue, 'Test_Job_Dequeue');
308+
Resque::enqueue($queue, 'Test_Job_Dequeue', $arg);
309+
$this->assertEquals(Resque::size($queue), 2);
310+
$test = array('Test_Job_Dequeue' => $arg2);
311+
$this->assertEquals(Resque::dequeue($queue, $test), 1);
312+
$this->assertEquals(Resque::size($queue), 1);
313+
}
314+
315+
public function testDequeueItemWithiWrongArg()
316+
{
317+
$queue = 'jobs';
318+
$arg = array('foo' => 1, 'bar' => 2);
319+
$arg2 = array('foo' => 2, 'bar' => 3);
320+
Resque::enqueue($queue, 'Test_Job_Dequeue');
321+
Resque::enqueue($queue, 'Test_Job_Dequeue', $arg);
322+
$this->assertEquals(Resque::size($queue), 2);
323+
$test = array('Test_Job_Dequeue' => $arg2);
324+
$this->assertEquals(Resque::dequeue($queue, $test), 0);
325+
$this->assertEquals(Resque::size($queue), 2);
326+
}
327+
256328
}

0 commit comments

Comments
 (0)