/** * @param callable $errorCallback * @return bool * @throws RuntimeException */ public function process(Closure $errorCallback = null) { if (!$errorCallback) { $errorCallback = function () { }; } try { $message = $this->queue->dequeue(); } catch (RuntimeException $e) { $errorCallback($this, $e); return false; } if (!$message) { $this->eventDispatcher->dispatch(Events::QUEUE_EMPTY); return false; } $this->eventDispatcher->dispatch(Events::MESSAGE_RECEIVE, new MessageEvent($message)); $result = $this->handleMessage($message); if (!$result) { $this->eventDispatcher->dispatch(Events::MESSAGE_NOT_HANDLABLE, new MessageEvent($message)); throw new RuntimeException(sprintf("No handler will handle a message of topic '%s'", $message->getTopic())); } if ($result->isSuccess()) { $this->queue->ack($message); } return true; }
/** * @dataProvider provideMessages * @test */ public function messagesGoThroughThePipeUnchanged($topic, $data) { $this->assertFalse($this->queue->dequeue()); $message = $this->queue->enqueue($topic, $data); $dequeued = $this->queue->dequeue(); $this->assertInstanceOf('Pekkis\\Queue\\Message', $dequeued); $this->assertEquals($message->getTopic(), $dequeued->getTopic()); $this->assertEquals($message->getData(), $dequeued->getData()); $this->queue->ack($dequeued); $this->assertFalse($this->queue->dequeue()); }
/** * @test */ public function unknownDataThrowsExceptionWhenUnserializing() { $this->setExpectedException('RuntimeException', 'Unserializer not found'); $serialized = new SerializedData('SomeRandomSerializer', 'xooxoo'); $arr = array('uuid' => 'uuid', 'topic' => 'lus.tus', 'data' => $serialized->toJson()); $json = json_encode($arr); $this->adapter->expects($this->once())->method('dequeue')->will($this->returnValue(array($json, 'aybabtu', []))); $this->queue->dequeue(); }
<?php namespace Pekkis\Queue\Example; use Pekkis\Queue\Adapter\IronMQAdapter; use Pekkis\Queue\Message; use Pekkis\Queue\Queue; require_once is_file(__DIR__ . '/bootstrap.php') ? __DIR__ . '/bootstrap.php' : __DIR__ . '/bootstrap.dist.php'; // Create a new IronMQ backed queue $queue = new Queue(new IronMQAdapter(IRONMQ_TOKEN, IRONMQ_PROJECT_ID, 'pekkis-queue-example')); // Queues can be emptied. $queue->purge(); // A message consists of a topic and data. A message instance with an UUID you can use is returned. $message = $queue->enqueue('pekkis.queue.example', array('some' => 'random data')); // Dequeue and process a single message $received = $queue->dequeue(); $data = $received->getData(); var_dump($data); // Acknowledge the message (you're done with it) $queue->ack($received);