/** * @test */ public function getQueueSettingsMergesPresetWithQueueSettings() { $this->inject($this->queueManager, 'settings', ['presets' => ['somePreset' => ['className' => 'Some\\Preset\\ClassName', 'maximumNumberOfReleases' => 123, 'queueNamePrefix' => 'presetPrefix', 'options' => ['option1' => 'from preset', 'option2' => 'from preset'], 'releaseOptions' => ['bar' => 'from preset']]], 'queues' => ['TestQueue' => ['preset' => 'somePreset', 'className' => TestQueue::class, 'maximumNumberOfReleases' => 321, 'queueNamePrefix' => 'queuePrefix', 'options' => ['option2' => 'overridden from queue', 'option3' => 'from queue'], 'releaseOptions' => ['bar' => 'from queue']]]]); $expectedSettings = ['className' => TestQueue::class, 'maximumNumberOfReleases' => 321, 'queueNamePrefix' => 'queuePrefix', 'options' => ['option1' => 'from preset', 'option2' => 'overridden from queue', 'option3' => 'from queue'], 'releaseOptions' => ['bar' => 'from queue'], 'preset' => 'somePreset']; $queueSettings = $this->queueManager->getQueueSettings('TestQueue'); $this->assertSame($expectedSettings, $queueSettings); }
/** * Wait for a job in the given queue and execute it * A worker using this method should catch exceptions * * @param string $queueName * @param integer $timeout * @return Message The message that was processed or NULL if no job was executed and a timeout occurred * @throws \Exception * @api */ public function waitAndExecute($queueName, $timeout = null) { $queue = $this->queueManager->getQueue($queueName); $message = $queue->waitAndReserve($timeout); if ($message === null) { $this->emitMessageTimeout($queue); // timeout return null; } $this->emitMessageReserved($queue, $message); $queueSettings = $this->queueManager->getQueueSettings($queueName); try { if (isset($queueSettings['executeIsolated']) && $queueSettings['executeIsolated'] === true) { Scripts::executeCommand('flowpack.jobqueue.common:job:execute', $this->flowSettings, false, [$queue->getName(), base64_encode(serialize($message))]); } else { $this->executeJobForMessage($queue, $message); } } catch (\Exception $exception) { $maximumNumberOfReleases = isset($queueSettings['maximumNumberOfReleases']) ? (int) $queueSettings['maximumNumberOfReleases'] : 0; if ($message->getNumberOfReleases() < $maximumNumberOfReleases) { $releaseOptions = isset($queueSettings['releaseOptions']) ? $queueSettings['releaseOptions'] : []; $queue->release($message->getIdentifier(), $releaseOptions); $this->emitMessageReleased($queue, $message, $releaseOptions, $exception); throw new JobQueueException(sprintf('Job execution for job (message: "%s", queue: "%s") failed (%d/%d trials) - RELEASE', $message->getIdentifier(), $queue->getName(), $message->getNumberOfReleases() + 1, $maximumNumberOfReleases + 1), 1334056583, $exception); } else { $queue->abort($message->getIdentifier()); $this->emitMessageFailed($queue, $message, $exception); throw new JobQueueException(sprintf('Job execution for job (message: "%s", queue: "%s") failed (%d/%d trials) - ABORTING', $message->getIdentifier(), $queue->getName(), $message->getNumberOfReleases() + 1, $maximumNumberOfReleases + 1), 1334056584, $exception); } } $queue->finish($message->getIdentifier()); $this->emitMessageFinished($queue, $message); return $message; }
/** * Describe a single queue * * Displays the configuration for a queue, merged with the preset settings if any. * * @param string $queue Name of the queue to describe (e.g. "some-queue") * @return void */ public function describeCommand($queue) { $queueSettings = $this->queueManager->getQueueSettings($queue); $this->outputLine('Configuration options for Queue <b>%s</b>:', [$queue]); $rows = []; foreach ($queueSettings as $name => $value) { $rows[] = [$name, is_array($value) ? json_encode($value, JSON_PRETTY_PRINT) : $value]; } $this->output->outputTable($rows, ['Option', 'Value']); }