Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b2da912

Browse files
author
Richard Shank
committed
finish refactoring to handle queues
1 parent 752ac9c commit b2da912

9 files changed

Lines changed: 113 additions & 54 deletions

File tree

composer.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
],
1212
"keywords": ["Vespolina", "workflow"],
1313
"require": {
14+
"doctrine/inflector": "~1.0",
1415
"php": ">=5.3.0",
1516
"psr/log": "1.0.0"
1617
},
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Vespolina\Workflow\Queue;
4+
5+
use Bernard\Producer;
6+
use Vespolina\Workflow\Message\BernardTokenMessage;
7+
8+
class BernardQueueHandler implements QueueHandlerInterface
9+
{
10+
protected $producer;
11+
12+
public function __construct(Producer $producer)
13+
{
14+
$this->producer = $producer;
15+
}
16+
17+
public function enqueue($location, $token)
18+
{
19+
$this->producer->produce(new BernardTokenMessage($location, $token), $location);
20+
21+
return true;
22+
}
23+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
4+
namespace Vespolina\Workflow\Queue;
5+
6+
7+
use Vespolina\Workflow\Workflow;
8+
9+
class BernardReceiver
10+
{
11+
protected $workflow;
12+
13+
public function __construct(Workflow $workflow)
14+
{
15+
$this->workflow = $workflow;
16+
}
17+
18+
public function __call($name, $arguments)
19+
{
20+
$token = $arguments[0]->getToken();
21+
22+
return $this->workflow->consumeQueue($token);
23+
}
24+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
<?php
2+
3+
namespace Vespolina\Workflow\Queue;
4+
5+
interface QueueHandlerInterface
6+
{
7+
8+
}

lib/Vespolina/Workflow/Task/BernardQueue.php

Lines changed: 0 additions & 26 deletions
This file was deleted.

lib/Vespolina/Workflow/Task/Queue.php

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public function accept(TokenInterface $token)
2424
$success = true;
2525
try {
2626
$success = $success && $this->preExecute($token);
27-
$success = $success && $this->execute($token);
27+
$success = $success && $this->workflow->produceQueue($token);
2828
} catch (\Exception $e) {
2929
if ($e instanceof ProcessingFailureException) {
3030
$this->workflow->addError($e->getMessage());
@@ -36,18 +36,11 @@ public function accept(TokenInterface $token)
3636
return $success;
3737
}
3838

39-
public function getQueueName()
40-
{
41-
throw new \Exception('The execute method needs to be implement in your class');
42-
}
43-
44-
protected function postConsume(TokenInterface $token)
39+
public function consume(TokenInterface $token)
4540
{
46-
$message = 'Token continues post Consume in ' . $this->getName();
47-
$this->logger->info($message, array('token' => $token));
48-
4941
$success = true;
5042
try {
43+
$success = $success && $this->execute($token);
5144
$success = $success && $this->postExecute($token);
5245
$success = $success && $this->cleanUp($token);
5346
} catch (\Exception $e) {
@@ -57,6 +50,7 @@ protected function postConsume(TokenInterface $token)
5750

5851
return false;
5952
}
53+
$this->finalize($token);
6054

6155
return $success;
6256
}

lib/Vespolina/Workflow/Workflow.php

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,26 @@
99

1010
namespace Vespolina\Workflow;
1111

12+
use Doctrine\Common\Inflector\Inflector;
1213
use Psr\Log\LoggerInterface;
14+
use Vespolina\Workflow\TokenInterface;
1315
use Vespolina\Workflow\TransactionInterface;
16+
use Vespolina\Workflow\Queue\QueueHandlerInterface;
1417

1518
class Workflow
1619
{
1720
protected $arcs;
1821
protected $errors;
1922
protected $logger;
2023
protected $nodes;
24+
protected $queueHandler;
2125
protected $tokens;
2226

23-
public function __construct(LoggerInterface $logger)
27+
public function __construct(LoggerInterface $logger, QueueHandlerInterface $queueHandler = null)
2428
{
2529
$this->logger = $logger;
30+
$this->queueHandler = $queueHandler;
31+
2632
$this->start = new Place();
2733
$this->addNode($this->start, 'workflow.start');
2834
$this->finish = new Place();
@@ -167,6 +173,22 @@ public function getErrors()
167173
return $this->errors;
168174
}
169175

176+
public function consumeQueue(TokenInterface $token)
177+
{
178+
$location = $token->getLocation();
179+
$node = $this->nodes[$location];
180+
181+
$message = 'Token is consumed in ' . $location;
182+
$this->logger->info($message, array('token' => $token));
183+
184+
return $node->consume($token);
185+
}
186+
187+
public function produceQueue(TokenInterface $token)
188+
{
189+
return $this->queueHandler->enqueue($token->getLocation(), $token);
190+
}
191+
170192
public function addToken(TokenInterface $token)
171193
{
172194
$this->tokens[] = $token;

tests/Vespolina/Tests/Task/BernardQueueTest.php

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,18 @@
99
use Bernard\Producer;
1010
use Bernard\QueueFactory\InMemoryFactory;
1111
use Bernard\Router\SimpleRouter;
12+
use Monolog\Handler\TestHandler;
1213
use Monolog\Logger;
14+
use Vespolina\Tests\WorkflowCommon;
15+
use Vespolina\Workflow\Queue\BernardQueueHandler;
16+
use Vespolina\Workflow\Queue\BernardReceiver;
1317
use Vespolina\Workflow\Token;
1418

1519
class BernardQueueTest extends \PHPUnit_Framework_TestCase
1620
{
21+
protected $producer;
22+
protected $queues;
23+
1724
public function setUp()
1825
{
1926
$this->queues = new InMemoryFactory;
@@ -22,36 +29,42 @@ public function setUp()
2229

2330
public function testExecuteAndConsume()
2431
{
25-
$task = $this->getMock('Vespolina\Workflow\Task\BernardQueue', ['getQueueName', 'testQueue'], [$this->producer]);
26-
$task->expects($this->any())
27-
->method('getQueueName')
28-
->will($this->returnValue('TestQueue'));
29-
$task->expects($this->once())
30-
->method('testQueue')
31-
->will($this->returnValue(true));
32+
$logger = new Logger('test');
33+
$handler = new TestHandler();
34+
$logger->pushHandler($handler);
35+
36+
$queueHandler = new BernardQueueHandler($this->producer);
3237

33-
$rp = new \ReflectionProperty($task, 'logger');
34-
$rp->setAccessible(true);
35-
$rp->setValue($task, new Logger('test'));
36-
$rp->setAccessible(false);
38+
$workflow = WorkflowCommon::createWorkflow($logger, $queueHandler);
3739

3840
$token = new Token();
41+
$token->setLocation('queue_test');
3942
$token->setData('label', 'test');
4043
$token->setData('array', ['a' => 'b']);
4144
$token->setData('object', new TestObject());
4245

46+
$task = $this->getMock('Vespolina\Workflow\Task\Queue', ['consume']);
47+
$task->expects($this->once())
48+
->method('consume')
49+
->with($token)
50+
->will($this->returnValue(true));
51+
52+
$task->setWorkflow($workflow, $logger);
53+
$workflow->addNode($task, 'queue_test');
54+
4355
$this->assertTrue($task->accept($token), 'true should be returned when the token is pushed into the queue');
4456

45-
$envelope = $this->queues->create('TestQueue')->dequeue();
57+
$envelope = $this->queues->create('queue_test')->dequeue();
4658
$message = $envelope->getMessage();
4759
$this->assertEquals($token, $message->getToken());
48-
$this->queues->create('TestQueue')->enqueue($envelope);
60+
$this->queues->create('queue_test')->enqueue($envelope);
4961

50-
$this->router = new SimpleRouter(['TestQueue' => $task]);
62+
$receiver = new BernardReceiver($workflow);
63+
$this->router = new SimpleRouter(['queue_test' => $receiver]);
5164
$this->middleware = new MiddlewareBuilder();
5265
$this->consumer = new Consumer($this->router, $this->middleware);
5366

54-
$this->consumer->consume($this->queues->create('TestQueue'), ['max-runtime' => 1]);
67+
$this->consumer->consume($this->queues->create('queue_test'), ['max-runtime' => 1]);
5568
}
5669
}
5770

tests/Vespolina/Tests/WorkflowCommon.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,12 @@ public static function createToken()
4343
return new Token();
4444
}
4545

46-
public static function createWorkflow($logger = null)
46+
public static function createWorkflow($logger = null, $queueHandler = null)
4747
{
4848
if (!$logger) {
4949
$logger = new Logger('test');
5050
}
5151

52-
return new Workflow($logger);
52+
return new Workflow($logger, $queueHandler);
5353
}
5454
}

0 commit comments

Comments
 (0)