Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Laravel 如何从环境变量设置侦听器队列名称?_Laravel_Laravel 5_Queue_Listener_Jobs - Fatal编程技术网

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

Laravel 如何从环境变量设置侦听器队列名称?,laravel,laravel-5,queue,listener,jobs,Laravel,Laravel 5,Queue,Listener,Jobs,我只是注意到我的一些听众没有使用我期望他们使用的队列。几周前,我们的团队从Laravel 5.2升级到了5.5,我想这就是问题开始出现的时候。系统上没有太多负载,所以我只是偶然发现的 无论如何。我曾经通过队列方法在侦听器上设置队列名称,如下所示: public function queue(QueueManager $handler, $method, $arguments): void { $handler->connection()->push($method, $arg

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

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

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

public function __construct()
{
    $this->queue = Queue::getNotificationQueue();
}
这种方法不再有效,因此默认队列最终将处理作业,而不是预期的通知队列

因此,我查看了文档,其中说明应该在侦听器的队列属性上设置名称。我的问题是,我在环境变量中有队列名称,因此我不能直接将其设置为属性,如文档中所示,在构造函数中设置它是不起作用的,如下所示:

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

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

这里有人知道我该如何解决这个问题吗?

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

但是,对于排队事件侦听器上的动态队列名称(例如,根据环境的不同而变化),定制
SqsConnector
sqsqsqueue
将是解决问题的一种方法

下面是一个实现示例

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>';
    }
}
customsqqueue.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);
    }
}
CustomSqQueueServiceProvider.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
中,您的默认SQS连接驱动程序从
SQS
custom_SQS
特别是对于SQS队列,
$queue
属性的行为有点奇怪,因为它似乎没有引用
queue.php
中定义的队列,但它需要一个完整的队列url,因此,即使是文档中的示例也似乎不适用

但是,对于排队事件侦听器上的动态队列名称(例如,根据环境的不同而变化),定制
SqsConnector
sqsqsqueue
将是解决问题的一种方法

下面是一个实现示例

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>';
    }
}
customsqqueue.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);
    }
}
CustomSqQueueServiceProvider.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
中,从
SQS
custom_SQS

的默认SQS连接驱动程序是有意义的。我将尝试此解决方案,并尽快与您联系。谢谢,很好。谢谢大家!@自定义队列应该放在句柄中吗?这里需要一些帮助才有意义。我将尝试此解决方案,并尽快与您联系。谢谢,很好。谢谢大家!@自定义队列应该放在句柄中吗?这里需要一些帮助吗