Laravel Single Job Class отправляется несколько раз с перезаписью разных параметров

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

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

Как мне этого не допустить?

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

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));
    }
}


person mrpritchett    schedule 25.02.2020    source источник
comment
Не могли бы вы поделиться своим ThisJob кодом класса?   -  person Foued MOUSSI    schedule 25.02.2020
comment
Я должен был быть более ясным. Пример кода - ThisJob. Задание является рекурсивным, чтобы просмотреть все результаты вызова Stripe API.   -  person mrpritchett    schedule 25.02.2020
comment
Это странно. Я никогда не слышал о приоритетных вакансиях. Разве не то, что вы делаете с результатами, которые игнорируются?   -  person Clément Baconnier    schedule 25.02.2020


Ответы (1)


Согласно документации 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'));

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

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

E.g:

dispatch(new ThisJob($this->brand_id, $new_start_after)->onQueue(uniqid() . '_' . $this->brand_id));
person Foued MOUSSI    schedule 25.02.2020