/** * Returns a task to work on. * * @param string $tube (optional) the tube(queue) to reserve a task from * * @throws TaskQueueServiceException * @return WorkPackage */ public function reserveTask($tube = null) { if (is_null($tube)) { $tube = $this->defaultTube; } $inTask = $this->beanstalk->watch($tube)->ignore('default')->reserve(2); if ($inTask === false) { return null; } $data = $inTask->getData(); $parts = explode("::", $data, 2); if (count($parts) !== 2) { $this->beanstalk->delete($inTask); throw new TaskQueueServiceException("Invalid format in TaskQueue {$tube}"); } try { $taskObject = $this->serializer->deserialize($parts[1], $parts[0], 'json'); } catch (UnsupportedFormatException $exception) { $this->beanstalk->delete($inTask); throw new TaskQueueServiceException("Invalid format in TaskQueue {$tube} "); } catch (\ReflectionException $exception) { $this->beanstalk->delete($inTask); throw new TaskQueueServiceException("Invalid format in TaskQueue {$tube} class " . $parts[0] . ' is unknown'); } if (!$taskObject instanceof TaskDescriptionInterface) { $this->beanstalk->delete($inTask); throw new TaskQueueServiceException("Invalid data in TaskQueue {$tube}"); } if (!$this->databaseDisabled) { $taskEntity = $this->taskRepo->find($taskObject->getTaskIdentifier()); } else { //remake the task entity $taskEntity = new Task($taskObject, '', $tube); } if (!$taskEntity instanceof Task) { $this->beanstalk->delete($inTask); throw new TaskQueueServiceException("Unable to find taskEntity for task:" . $taskObject->getTaskIdentifier()); } /** * @var Task $taskEntity */ $workPackage = new WorkPackage($taskEntity, $inTask, $taskObject); $this->updateTaskStatus($workPackage, Task::STATUS_WORKING); return $workPackage; }
/** * @return void */ public function testIfWatchWrapsProperly() { $this->pheanstalk->shouldReceive('watch')->with('tube')->once(); $return = $this->connection->watch('tube'); $this->assertEquals($this->connection, $return, 'Return should be the same as the connection'); }