Skip to content

Commit 87ae848

Browse files
committed
Update bootstrap script to create an appropriate reserver based off the environment.
1 parent 572f173 commit 87ae848

File tree

3 files changed

+100
-8
lines changed

3 files changed

+100
-8
lines changed

bin/resque

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@ if (!class_exists('Composer\Autoload\ClassLoader', false)) {
2525
);
2626
}
2727

28+
use Resque\Reserver\ReserverFactory;
29+
use Resque\Reserver\UnknownReserverException;
30+
2831
$QUEUE = getenv('QUEUE');
2932
if(empty($QUEUE)) {
3033
die("Set QUEUE env var containing the list of queues to work.\n");
@@ -73,7 +76,22 @@ if (!isset($logger) || !is_object($logger)) {
7376
$logger = new Resque_Log($logLevel);
7477
}
7578

76-
$BLOCKING = getenv('BLOCKING') !== FALSE;
79+
$reserverFactory = new ReserverFactory($logger);
80+
Resque_Worker::setReserverFactory($reserverFactory);
81+
82+
$queues = explode(',', $QUEUE);
83+
if (!is_array($queues)) {
84+
$queues = array($queues);
85+
}
86+
87+
$reserver = null;
88+
try {
89+
$reserver = $reserverFactory->createReserverFromEnvironment($queues);
90+
} catch (UnknownReserverException $exception) {
91+
$logger->emergency("Could not create reserver: {error}", ['error' => $exception->getMessage()]);
92+
die;
93+
}
94+
7795

7896
$interval = 5;
7997
$INTERVAL = getenv('INTERVAL');
@@ -102,19 +120,17 @@ if($count > 1) {
102120
}
103121
// Child, start the worker
104122
else if(!$pid) {
105-
$queues = explode(',', $QUEUE);
106-
$worker = new Resque_Worker($queues);
123+
$worker = new Resque_Worker($reserver, $queues);
107124
$worker->setLogger($logger);
108125
$logger->log(Psr\Log\LogLevel::NOTICE, 'Starting worker {worker}', array('worker' => $worker));
109-
$worker->work($interval, $BLOCKING);
126+
$worker->work($interval);
110127
break;
111128
}
112129
}
113130
}
114131
// Start a single worker
115132
else {
116-
$queues = explode(',', $QUEUE);
117-
$worker = new Resque_Worker($queues);
133+
$worker = new Resque_Worker($reserver, $queues);
118134
$worker->setLogger($logger);
119135

120136
$PIDFILE = getenv('PIDFILE');
@@ -124,6 +140,5 @@ else {
124140
}
125141

126142
$logger->log(Psr\Log\LogLevel::NOTICE, 'Starting worker {worker}', array('worker' => $worker));
127-
$worker->work($interval, $BLOCKING);
143+
$worker->work($interval);
128144
}
129-
?>

lib/Resque/Reserver/ReserverFactory.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,32 @@ public function createReserverFromName($name, array $queues)
4343
return $this->$methodName($queues);
4444
}
4545

46+
/**
47+
* Creates a reserver based off the environment configuration.
48+
*
49+
* The following environment vars are checked (in this order):
50+
* - BLOCKING: Creates a BlockingListPopReserver (any non empty value)
51+
* - RESERVER: Creates a reserver specified in snake case format without the reserver suffix, eg. 'random_queue_order'
52+
*
53+
* If neither var is specified, the default resever (QueueOrderReserver) is created.
54+
*
55+
* @param array $queues
56+
* @return ReserverInterface
57+
* @throws UnknownReserverException If the reserver specified in RESERVER could not be found.
58+
*/
59+
public function createReserverFromEnvironment(array $queues)
60+
{
61+
if (!empty(getenv('BLOCKING'))) {
62+
$reserver = $this->createBlockingListPopReserver($queues);
63+
} elseif (getenv('RESERVER') !== false) {
64+
$reserver = $this->createReserverFromName((string)getenv('RESERVER'), $queues);
65+
} else {
66+
$reserver = $this->createDefaultReserver($queues);
67+
}
68+
69+
return $reserver;
70+
}
71+
4672
/**
4773
* Creates the default reserver.
4874
*

test/Resque/Tests/Reserver/ReserverFactoryTest.php

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,4 +57,55 @@ public function testCreateDefaultReserverCreatesExpectedReserver()
5757
$reserver = $this->getFactory()->createDefaultReserver(array());
5858
$this->assertInstanceOf('\Resque\Reserver\QueueOrderReserver', $reserver);
5959
}
60+
61+
public function createReserverFromEnvironmentDataProvider()
62+
{
63+
return array(
64+
array(array('BLOCKING=1'), '\Resque\Reserver\BlockingListPopReserver'),
65+
array(array('BLOCKING=0', 'RESERVER=random_queue_order'), '\Resque\Reserver\RandomQueueOrderReserver'),
66+
array(array('BLOCKING=', 'RESERVER=random_queue_order'), '\Resque\Reserver\RandomQueueOrderReserver'),
67+
array(array('RESERVER=Queue_Order'), '\Resque\Reserver\QueueOrderReserver'),
68+
array(array(), '\Resque\Reserver\QueueOrderReserver'),
69+
);
70+
}
71+
72+
/**
73+
* @dataProvider createReserverFromEnvironmentDataProvider
74+
*/
75+
public function testCreateReserverFromEnvironmentCreatesExpectedReserver($env, $expectedReserver)
76+
{
77+
$queues = array(
78+
'queue_a',
79+
'queue_b',
80+
'queue_c',
81+
'queue_d',
82+
);
83+
84+
foreach ($env as $var) {
85+
putenv($var);
86+
}
87+
88+
$reserver = $this->getFactory()->createReserverFromEnvironment($queues);
89+
$this->assertInstanceOf($expectedReserver, $reserver);
90+
91+
// account for shuffling by RandomQueueOrderReserver
92+
$actualQueues = $reserver->getQueues();
93+
sort($actualQueues);
94+
95+
$this->assertEquals($queues, $actualQueues);
96+
97+
putenv('BLOCKING');
98+
putenv('RESERVER');
99+
}
100+
101+
/**
102+
* @expectedException Resque\Reserver\UnknownReserverException
103+
* @expectedExceptionMessage Unknown reserver 'foobar'
104+
*/
105+
public function testCreateReserverFromEnvironmentThrowsExceptionForUnknownReserver()
106+
{
107+
putenv('RESERVER=foobar');
108+
$this->getFactory()->createReserverFromEnvironment(array());
109+
putenv('RESERVER');
110+
}
60111
}

0 commit comments

Comments
 (0)