Диспетчеризация Lumen выполняется без базы данных. - PullRequest
0 голосов
/ 04 июля 2018

Что у меня есть:

  • Служба Lumen, которая обрабатывает конкретную работу
  • Портал 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 не добавлено ни одной работы. Когда я использую Почтальон, все в порядке. Однако, когда я пытаюсь отправить запрос от бэкэнда 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 Ответ

0 голосов
/ 04 июля 2018

Хорошо, это было действительно интересно. После эхолота config('queue.default') в моем контроллере оказалось, что это действительно значение sync, тем не менее, я все правильно установил.

Тогда я предположил, что, возможно, причина в самом Laravel и его переменных. Действительно, в файле .env со стороны Laravel QUEUE_DRIVER устанавливается на sync. После того как я изменил его на QUEUE_DRIVER=database все заработало как положено.

Надеюсь, что это поможет кому-то в будущем.

...