Skip to content

Commit

Permalink
Merge pull request #39 from petehouston/master
Browse files Browse the repository at this point in the history
Provide status callbacks.
  • Loading branch information
trandangtri committed Sep 26, 2018
2 parents 06bf3ca + 8b83f7d commit a08f104
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 1 deletion.
52 changes: 51 additions & 1 deletion Service/Worker/AbstractWorker.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
*/
abstract class AbstractWorker
{
/** @var string Worker error message after processing. */
private $error = null;

/**
* @param Message $message
*
Expand All @@ -27,10 +30,14 @@ final public function process(Message $message)
try {
$result = $this->execute($message);
} catch (\Exception $e) {
return false;
$result = false;
$this->error = $e->getMessage();
}
$this->postExecute($message);

// Let worker does something on success or failure
$result === true ? $this->onSucceeded() : $this->onFailed();

return $result;
}

Expand All @@ -43,6 +50,8 @@ protected function preExecute(Message $message)
}

/**
* Do something via post execution. It is better to proceed with task related to message.
*
* @param Message $message
*/
protected function postExecute(Message $message)
Expand All @@ -56,4 +65,45 @@ protected function postExecute(Message $message)
* @return boolean
*/
abstract protected function execute(Message $message);

/**
* Event fired when worker has processed message successfully.
*
* @return void
*/
protected function onSucceeded()
{
// Do something here
}

/**
* Event fired when worker has failed to process message.
*
* @return void
*/
protected function onFailed()
{
// Do something here
}

/**
* Check if worker has error after processing.
* By default, error is set to <code>null</code>.
*
* @return bool
*/
public function hasError()
{
return $this->error !== null;
}

/**
* Get worker error message.
*
* @return string
*/
public function error()
{
return $this->error;
}
}
15 changes: 15 additions & 0 deletions Tests/Unit/Service/Worker/AbstractWorkerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ private function getAbstractWorker()
{
/** @var \PHPUnit_Framework_MockObject_MockObject|AbstractWorker $client */
$worker = $this->getMockBuilder(AbstractWorker::class)
->setMethods(['preExecute', 'postExecute', 'onSucceeded', 'onFailed'])
->getMockForAbstractClass();

return $worker;
Expand Down Expand Up @@ -51,9 +52,16 @@ public function testProcessWithNormalMessage()
->method('execute')
->with($message)
->willReturn(true);
$worker->expects($this->once())->method(('preExecute'))->with($message);
$worker->expects($this->once())->method(('postExecute'))->with($message);
$worker->expects($this->once())->method('onSucceeded');
$worker->expects($this->never())->method('onFailed');

$result = $worker->process($message);

$this->assertTrue($result);
$this->assertFalse($worker->hasError());
$this->assertNull($worker->error());
}

/**
Expand All @@ -68,8 +76,15 @@ public function testProcessInFailure()
->method('execute')
->with($message)
->willThrowException(new \Exception());
$worker->expects($this->once())->method(('preExecute'))->with($message);
$worker->expects($this->once())->method(('postExecute'))->with($message);
$worker->expects($this->once())->method('onFailed');
$worker->expects($this->never())->method('onSucceeded');

$result = $worker->process($message);

$this->assertFalse($result);
$this->assertTrue($worker->hasError());
$this->assertNotNull($worker->error());
}
}

0 comments on commit a08f104

Please sign in to comment.