在没有数据库队列驱动程序的情况下完成流明作业调度

Posted

技术标签:

【中文标题】在没有数据库队列驱动程序的情况下完成流明作业调度【英文标题】:Lumen job dispatching done without database Queue Driver 【发布时间】:2018-12-12 22:07:10 【问题描述】:

我有什么:

处理特定作业的流明服务 Laravel 门户将文件发送到该服务以供其处理

一旦它只使用 JS 和 Ajax,它几乎可以正常工作——我唯一需要实现的是 CORS 中间件。但是,在我将逻辑移至 JWT(使用 jwt-auth 包)和 GuzzleHttp(我正在使用它向服务 API 发送请求)之后,作业停止了通过数据库队列处理,而是像队列驱动程序设置为 sync 一样运行。

以下是我在 API 调用期间调用的控制器:

public function processPackageById(Request $request) 
    $id = $request->package_id;
    $package = FilePackage::where('id', '=', $id)->where('package_status_id', '=', 1)->first();

    if($package) 
        Queue::push(new PackageProcessingJob(
            $this->firm,
            $this->accounts,
            $package
        ));

        return 'dispatching done for ' . $id;
    
    return 'dispatching not done for ' . $id;

其中$this->firm$this->accounts 是特定模型的注入存储库。 FilePackage 对象正在 Laravel 站点上创建,并且两者共享相同的数据库。

因此没有作业被添加到jobs 表中。当我使用 Postman 时,一切都很好。但是,当我尝试从 Laravel 后端发送请求时:

public function uploaderPost(Request $request)

    // Here we get auth token and put into protected valiable `$this->token`
    $this->authorizeApi(); 

    $requestData = $request->except('_token');


    $package = $requestData['file'];

    $uploadPackageRequest =
        $this->client->request('POST', config('bulk_api.url') .'/api/bulk/upload?token=' . $this->token,
            [
            'multipart' => [
                [
                    'name'     => 'file',
                    'contents' => fopen($package->getPathName(), 'r'),
                    'filename' => $package->getClientOriginalName(),
                ],
            ]
        ]);
    $uploadPackageRequestJson = json_decode($uploadPackageRequest->getBody()->getContents());
    $uploadPackageRequestStatus = $uploadPackageRequestJson->status;

    if($uploadPackageRequestStatus == 1) 
        $package = BulkUploadPackage::where('id', '=',$uploadPackageRequestJson->id)->first();

        // If package is okay - running it
        if($package !== null)
            // Here where I expect job to be dispatched (code above)
            $runPackageRequest =
                $this->client->request('POST', config('api.url') .'/api/bulk/run?token=' . $this->token,
                    [
                        'multipart' => [
                            [
                                'name' => 'package_id',
                                'contents' => $package->id
                            ],
                        ]
                    ]);


            // Here I'm receiving stream for some reason
            dd($runPackageRequest->getBody());

            if($runPackageRequest->getStatusCode()==200)
                return redirect(url('/success'));
            
        
    
    return back();

谁能告诉我这里出了什么问题以及导致问题的原因? 谢谢!

【问题讨论】:

【参考方案1】:

好吧,这真的很有趣。在我的控制器中回显config('queue.default') 之后,它似乎确实是sync 的价值,但我正确设置了所有内容。

然后我假设这可能是 Laravel 本身及其变量的原因。事实上,在 Laravel 端的 .env 文件中,QUEUE_DRIVER 被设置为 sync。在我将其更改为 QUEUE_DRIVER=database 后,一切都开始按预期工作。

希望将来能对某人有所帮助。

【讨论】:

以上是关于在没有数据库队列驱动程序的情况下完成流明作业调度的主要内容,如果未能解决你的问题,请参考以下文章

优先队列底层实现是堆(heap)(操作系统进程调度)

优先队列原理与实现

优先队列原理与实现

作业调度算法

流明队列连接,数据库驱动

Laravel 队列(数据库驱动程序)+ Cron 作业(任务调度程序)堆叠并且在服务器崩溃后不再发送