Конфигурация очереди Lumen 5.1 SQS


Я создал новый проект, используя Lumen, чтобы заботиться о отправке электронной почты и некоторых других небольших задач. Однако для некоторых писем, которые нужно отправить, я хочу использовать очередь Amazon.

В документации Люмена, они единственное, что упоминается, это: Опция QUEUE_DRIVER в вашем .env файл определяет очередь "драйвер", который будет использоваться вашим приложением.

Я установил это в SQS, как и предлагалось, однако я немного озадачен фактическими учетными данными amazon. Как я должен их определять? Единственная "релевантная" вещь, которую я видел, - это документация Amazon Здесь и здесь. Я также установил пакет" aws/aws-sdk-php":" ~3.0".

Однако эти ресурсы относятся непосредственно к использованию API SQS. Я хочу иметь возможность вызывать очередь, как это описано в Lumen, так что что-то вроде Queue::push() или $this->dispatch().

Вот соответствующий код, который у меня есть.

Это в моем .env файл

QUEUE_DRIVER=sqs
AWS_KEY=key
AWS_SECRET=secretstuff
AWS_QUEUE=https://sqs.eu-west-1.amazonaws.com/
AWS_REGION=eu-west-1

Это мой контроллер

<?php namespace AppHttpControllers;

use AppJobsGuestEmailJob;
use LaravelLumenRoutingController as BaseController;
use Log, Queue;
use AwsSqsSqsClient;

class NotificationEmailController extends BaseController
{
    public function pushToQueue($id)
    {
        Queue::push(new GuestEmailJob($id));
        //$this->dispatch(new GuestEmailJob($id));
    }
}

И, наконец, это моя работа

<?php namespace AppJobs;

use IlluminateBusQueueable;
use IlluminateQueueSerializesModels;
use IlluminateQueueInteractsWithQueue;
use IlluminateContractsBusSelfHandling;
use IlluminateContractsQueueShouldQueue;
use Log;

abstract class GuestEmailJob implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    public function handle($id)
    {
        Log::info('within handle');
        $user = User::find($id);
    }
}

Я пробовал это и с Queue::push, и с $this->dispatch(). Когда запрос попадает на контроллер, все идет нормально до тех пор, пока не будет нажата очередь, и тогда ничего не происходит (никаких исключений тоже). У кого-нибудь есть идеи, что я делаю неправильно/упускаю?

1 2

1 ответ:

После того, как вы немного изучили исходный код, очевидно, у вас должна быть очередь.файл конфигурации php в каталоге config. Поэтому я просто вставил конфигурационный файл по умолчанию из laravel 5 и настроил его, и теперь он работает нормально. Довольно глупый вопрос, в конце концов, но не был ясен из самой документации. Вот конфигурация очереди по умолчанию на случай, если кто-то также столкнется с этим.

<?php

return [

    'default' => env('QUEUE_DRIVER', 'sync'),

    'connections' => [

        'sync' => [
            'driver' => 'sync',
        ],

        'database' => [
            'driver' => 'database',
            'table' => 'jobs',
            'queue' => 'default',
            'expire' => 60,
        ],

        'beanstalkd' => [
            'driver' => 'beanstalkd',
            'host'   => 'localhost',
            'queue'  => 'default',
            'ttr'    => 60,
        ],

        'sqs' => [
            'driver' => 'sqs',
            'key'    => 'your-public-key',
            'secret' => 'your-secret-key',
            'queue'  => 'your-queue-url',
            'region' => 'us-east-1',
        ],

        'iron' => [
            'driver'  => 'iron',
            'host'    => 'mq-aws-us-east-1.iron.io',
            'token'   => 'your-token',
            'project' => 'your-project-id',
            'queue'   => 'your-queue-name',
            'encrypt' => true,
        ],

        'redis' => [
            'driver' => 'redis',
            'connection' => 'default',
            'queue'  => 'default',
            'expire' => 60,
        ],

    ],

    'failed' => [
        'database' => 'mysql', 'table' => 'failed_jobs',
    ],

];