我使用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;
....
....
}
当我通过控制器分发作业时,这个方法非常有效,但是我希望在分发作业时,有一条特定的路由使用同步驱动程序而不是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'=>'sync'])似乎可以工作,但从Http控制器中不起作用...
# /app/Conosle/Commands/MyCommand.php
class ScrapeDrawing extends Command
{
use DispatchesJobs;
...
...
public function handle()
{
config(['queue.default'=>'sync'])
$this->dispatch(new \App\Jobs\MyJob());
}
}
Queue::driver('sync')->push(new \App\Jobs\MyJob());
这个怎么样? - ceejayozCall to undefined method Illuminate\Queue\Queue::driver()
- divups