Laravel Один класс заданий отправляется несколько раз с перезаписью различных параметров - PullRequest
0 голосов
/ 25 февраля 2020

Я использую Laravel Задания для извлечения данных из Stripe API в разбивке по страницам. По сути, каждая работа получает «идентификатор бренда» (пользователь может иметь несколько брендов на одну учетную запись) и параметр «начать после». Он использует это, чтобы узнать, какой токен чередования использовать и с чего начинать при вызовах с разбивкой на страницы (это задание вызывается само по себе, если в разбиении на страницы доступно больше чередующихся ответов). Это работает нормально, когда задание запускается один раз.

Но есть случай, когда пользователь может за короткое время добавить ключи чередования для нескольких брендов, и этот класс заданий может вызываться несколько раз одновременно с различными параметрами. Когда это происходит, тот процесс, который запускается последним, перезаписывает другие, потому что параметры перезаписываются только до последнего вызванного. Поэтому, если я начну задание чередования с brand_id = 1, а затем задание brand_id = 2, затем brand_id = 3, 3 перезапишут два других после одного цикла и только 3 будут переданы для всех будущих вызовов.

Как мне этого избежать?

Я пробовал stati c vars, я пробовал защищенные, приватные и публичные c vars. Я подумал, что мог бы решить эту проблему с помощью динамически создаваемых очередей для каждого бренда, но это кажется огромной головной болью.

public function __construct($brand_id, $start_after = null)
    {
        $this->brand_id       = $brand_id;
        $this->start_after = $start_after;
    }

public function handle()
{
    // Do stripe calls with $brand_id & $start_after

    if ($response->has_more) {
    // Call next job with new "start_at".
        dispatch(new ThisJob($this->brand_id, $new_start_after));
    }
}

1 Ответ

0 голосов
/ 25 февраля 2020

Согласно Laravel Документации

если вы отправите задание без явного определения, в какую очередь оно должно быть отправлено, задание будет помещено в очередь, которая является определено в атрибуте очереди конфигурации соединения.

// This job is sent to the default queue...
dispatch(new Job);

// This job is sent to the "emails" queue...
dispatch((new Job)->onQueue('emails'));

Однако передача заданий в несколько очередей с уникальными именами может быть особенно полезна для вашего варианта использования.

Имя очереди может быть любой строкой, которая однозначно идентифицирует саму очередь. Например, вы можете с помощью sh создать имя очереди на основе uniqid() и $brand_id.

Например:

dispatch(new ThisJob($this->brand_id, $new_start_after)->onQueue(uniqid() . '_' . $this->brand_id));
...