Change job classes to be instantiated rather than calling methods statically. This obviously makes it easier for state information to be destroyed after a job runs. This change is NOT backwards compatible and requests job classes be rewritten. Jobs also no longer receive arguments in the perform/setUp/tearDown methods but instead are passed as a $args variable to the instantiated job

This commit is contained in:
Chris Boulton 2010-08-01 15:23:41 +10:00
parent 5dc24ebbe4
commit 5f64653149
5 changed files with 33 additions and 33 deletions

View File

@ -6,6 +6,12 @@ and after every single run.
* Ability to specify a cluster/multiple redis servers and consistent hash * Ability to specify a cluster/multiple redis servers and consistent hash
between them (Thanks dceballos) between them (Thanks dceballos)
* Fix `APP_INCLUDE` environment variable not loading correctly. * Fix `APP_INCLUDE` environment variable not loading correctly.
* Jobs are no longer defined as static methods, and classes are instantiated
first. This change is NOT backwards compatible and requires job classes are
updated.
* Job arguments are passed to the job class when it is instantiated, and
are accessible by $this->args. This change will break existing job classes
that rely on arguments that have not been updated.
## 1.0 (2010-04-18) ## ## 1.0 (2010-04-18) ##

View File

@ -55,51 +55,46 @@ Jobs are queued as follows:
### Defining Jobs ### ### Defining Jobs ###
Each job should be in it's own class, and include a `perform` method. Each job should be in it's own class, and include a `perform` method.
It's important to note that classes are called statically.
class My_Job class My_Job
{ {
public static function perform($args) public function perform()
{ {
// Work work work // Work work work
echo $args['name']; echo $this->args['name'];
} }
} }
When the job is run, the class will be instantiated and any arguments
will be set as an array on the instantiated object, and are accessible
via `$this->args`.
Any exception thrown by a job will result in the job failing - be Any exception thrown by a job will result in the job failing - be
careful here and make sure you handle the exceptions that shouldn't careful here and make sure you handle the exceptions that shouldn't
result in a job failing. result in a job failing.
Jobs can also have `setUp` and `tearDown` methods. If a `setUp` method Jobs can also have `setUp` and `tearDown` methods. If a `setUp` method
is defined, it will be called along with `$args` before the `perform` is defined, it will be called before the `perform` method is run.
method is run. The `tearDown` method if defined, will be called with The `tearDown` method if defined, will be called after the job finishes.
`$args` also, after the job finishes.
class My_Job class My_Job
{ {
public static function setUp($args) public function setUp()
{ {
// ... Set up environment for this job // ... Set up environment for this job
} }
public static function perform($args) public function perform()
{ {
// .. Run job // .. Run job
} }
public static function tearDown($args) public function tearDown()
{ {
// ... Remove environment for this job // ... Remove environment for this job
} }
} }
It is **IMPORTANT** to note, that on operating systems where Resque
cannot fork to run a job (Mac OS X, or other platforms where the PHP
process control functions are unavailable), that because job classes
are static, their state will be retained between job calls. **ALWAYS**
reset the environment back to how you got it if you're using a `setUp`
method, by resetting changes in a `tearDown` method.
### Tracking Job Statuses ### ### Tracking Job Statuses ###
php-resque has the ability to perform basic status tracking of a queued php-resque has the ability to perform basic status tracking of a queued

View File

@ -130,14 +130,17 @@ class Resque_Job
); );
} }
if(method_exists($this->payload['class'], 'setUp')) { $instance = new $this->payload['class'];
call_user_func(array($this->payload['class'], 'setUp'), $this->payload['args']); $isntance->args = $this->payload['args'];
if(method_exists($instance, 'setUp')) {
$instance->setUp();
} }
call_user_func(array($this->payload['class'], 'perform'), $this->payload['args']); $instance->perform();
if(method_exists($this->payload['class'], 'tearDown')) { if(method_exists($instance, 'tearDown')) {
call_user_func(array($this->payload['class'], 'tearDown'), $this->payload['args']); $instance->tearDown();
} }
} }

View File

@ -150,7 +150,6 @@ class Resque_Tests_JobTest extends Resque_Tests_TestCase
$job->perform(); $job->perform();
$this->assertTrue(Test_Job_With_SetUp::$called); $this->assertTrue(Test_Job_With_SetUp::$called);
$this->assertEquals($payload['args'], Test_Job_With_SetUp::$data);
} }
public function testJobWithTearDownCallbackFiresSetUp() public function testJobWithTearDownCallbackFiresSetUp()
@ -166,6 +165,5 @@ class Resque_Tests_JobTest extends Resque_Tests_TestCase
$job->perform(); $job->perform();
$this->assertTrue(Test_Job_With_TearDown::$called); $this->assertTrue(Test_Job_With_TearDown::$called);
$this->assertEquals($payload['args'], Test_Job_With_TearDown::$data);
} }
} }

View File

@ -118,15 +118,14 @@ class Test_Job_Without_Perform_Method
class Test_Job_With_SetUp class Test_Job_With_SetUp
{ {
public static $called = false; public static $called = false;
public static $data = false; public $args = false;
public function setUp($data) public function setUp()
{ {
self::$called = true; self::$called = true;
self::$data = $data;
} }
public function perform($data) public function perform()
{ {
} }
@ -136,16 +135,15 @@ class Test_Job_With_SetUp
class Test_Job_With_TearDown class Test_Job_With_TearDown
{ {
public static $called = false; public static $called = false;
public static $data = false; public $args = false;
public function perform($data) public function perform()
{ {
} }
public function tearDown($data) public function tearDown()
{ {
self::$called = true; self::$called = true;
self::$data = $data;
} }
} }