在运行时更改Laravel 5.1中的队列驱动程序?

时间:2015-07-30 02:23:28

标签: php laravel laravel-5 laravel-5.1

我正在使用beanstalkd作为我的队列驱动程序:

# /.env
QUEUE_DRIVER=beanstalkd

# /config/queue.php
'default' => env('QUEUE_DRIVER', 'sync'),

和一个可排队的工作

# /app/Jobs/MyJob.php
class MyJob extends Job implements SelfHandling, ShouldQueue
{
    use InteractsWithQueue, SerializesModels;
    ....
    ....
}

当我通过控制器调度作业时,这很有用,但我想在调度时使用 sync 驱动程序而不是 beanstalkd 驱动程序的一个特定路径工作。中间件似乎就是这里的答案

# /app/Http/Controllers/MyController.php
public function create(Request $request)
{
    $this->dispatch(new \App\Jobs\MyJob());
}

# /app/Http/routes.php
Route::post('/create', ['middleware' => 'no_queue', 'uses' => 'MyController@create']);

# /app/Http/Middleware/NoQueue.php
public function handle($request, Closure $next)
{
    $response = $next($request);
    config(['queue.default'=>'sync']);
    return $response;
}

但是,该作业仍然被推送到beanstalkd队列。

换句话说,在从控制器调度作业时,如何在运行时更改队列驱动程序?

编辑: 调用 config(['queue.default'=&gt;'sync']) 确实似乎在Artisan命令中工作,而不是来自Http控制器... < / p>

# /app/Conosle/Commands/MyCommand.php

class ScrapeDrawing extends Command
{
    use DispatchesJobs;
    ...
    ...
    public function handle()
    {
        config(['queue.default'=>'sync'])
        $this->dispatch(new \App\Jobs\MyJob());
    }
}

2 个答案:

答案 0 :(得分:2)

在我的控制器方法中使用它来解决:

# /app/Http/Controllers/MyController.php
public function create(Request $request, QueueManager $queueManager)

    $defaultDriver = $queueManager->getDefaultDriver();

    $queueManager->setDefaultDriver('sync');

    \Queue::push(new \App\Jobs\MyJob());

    $queueManager->setDefaultDriver($defaultDriver);
}

在我的情况下,\ Queue:push()似乎注意到运行时的驱动程序更改而$ this-&gt; dispatch()没有。

答案 1 :(得分:1)

看看你的中间件做了什么 - $ next($ request); 是执行请求的代码。如您所见,您正在处理请求后更改配置。变化

public function handle($request, Closure $next)
{
  $response = $next($request);
  config(['queue.default'=>'sync']);
  return $response;
}

public function handle($request, Closure $next)
{
  config(['queue.default'=>'sync']);
  $response = $next($request);
  return $response;
}