如何从环境变量设置监听器队列名称?

问题描述 投票:0回答:1

我只是注意到我的一些听众没有使用我期望他们使用的队列。几个星期前我们的团队从Laravel 5.2升级到5.5,我想这就是问题开始发生的时候。系统负载不是很大,所以我只是偶然发现了它。

无论如何。我曾经通过队列方法在侦听器上设置队列名称,如下所示:

public function queue(QueueManager $handler, $method, $arguments): void
{
    $handler->connection()->push($method, $arguments, Queue::getNotificationQueue());
}

此方法不再起作用,因此默认队列最终处理作业而不是预期的通知队列。

所以我查看了文档https://laravel.com/docs/5.5/events#queued-event-listeners,它指出应该在侦听器的队列属性上设置名称。我的问题是我在环境变量中有队列名称,所以我不能直接将其设置为属性,如文档中所示,它不能在构造函数上设置它,如下所示:

protected $queue;

public function __construct()
{
    $this->queue = Queue::getNotificationQueue();
}

这里有没有人知道如何解决这个问题?

laravel laravel-5 queue listener jobs
1个回答
1
投票

特别是对于SQS队列,$queue属性有点奇怪,因为它似乎没有引用queue.php中定义的队列,但是它需要一个完整的队列URL,所以即使文档中的示例似乎也没有。

但是对于排队事件侦听器上的动态队列名称,例如根据环境而改变,制作自定义SqsConnectorSqsQueue将是解决问题的一种方法。

这是一个实现的例子。

ACMEEventListener.php

class ACMEEventListener implements ShouldQueue
{
    public function handle(Event $event): void
    {
        // I'm going to a custom queue
    }

    public static function getQueue(): string
    {
        return 'https://sqs.eu-central-1.amazonaws.com/<account id>/<queue name>';
    }
}

CustomSqsConnector.php

use Illuminate\Queue\Connectors\SqsConnector;
use Aws\Sqs\SqsClient;

class CustomSqsConnector extends SqsConnector
{
    public function connect(array $config)
    {
        $sqs = new SqsClient($config);

        return new CustomSqsQueue($sqs, $config['queue']);
    }
}

CustomSqsQueue.php

class CustomSqsQueue extends \Illuminate\Queue\SqsQueue
{

    public function push($job, $data = '', $queue = null)
    {
        if ($job instanceof CallQueuedListener && method_exists($job->class, 'getQueue')) {
            $queue = $job->class::getQueue();
        }

        return $this->pushRaw($this->createPayload($job, $data), $queue);
    }
}

CustomSqsQueueServiceProvider.php

class CustomSqsQueueServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->booted(function () {
            $this->app['queue']->extend('custom_sqs', function () {
                return new CustomSqsConnector;
            });
        });
    }
}

然后在你的queue.php中,从sqscustom_sqs的默认SQS连接驱动程序

© www.soinside.com 2019 - 2024. All rights reserved.