Laravel Nova: действия в очереди создают одно задание для нескольких ресурсов

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

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

Поэтому, когда очередь обрабатывается, вместо того, чтобы ставить каждый продукт в очередь для отдельного обновления, запускается одно задание, которое зацикливает все выбранные продукты и быстро выполняет несколько запросов API, что не является моим желаемым результатом.

Есть ли способ для действия создать задание для каждого ресурса, для которого выполняется действие?

Класс действия

class UpdateInventory extends Action implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    public function __construct()
    {
        $this->connection = config('queue.default');
        $this->queue = 'inventory_update';
    }

    /**
     * Perform the action on the given models.
     */
    public function handle(ActionFields $fields, Collection $products)
    {
        foreach ($products as $product) {
            try {
                $inventoryService = resolve(InventoryService::class);
                $inventoryService->updateProductInventory($product); // <- API calls within
                $this->markAsFinished($product);
            } catch (\Exception $e) {
                $this->markAsFailed($product, $e);
            }
        }

        return Action::message("Inventory update started");
    }
}

2 ответа

      class UpdateInventory extends Action implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

        /**
         * The number of models that should be included in each chunk.
         *
         * @var int
         */
        public static $chunkCount = 1;

}

Вы можете поручить Nova выполнять действия с очередью в виде пакета. Это требует миграции, поэтому вы создаете таблицу пакетов с помощью следующей командыphp artisan queue:batches-tableи перенесите вашу базу данных. Эта таблица содержитtotal_jobs,pending_jobs,failed_jobs,failed_job_idsполя, чтобы вы могли отслеживать каждую работу. Если у каждого задания есть один ресурс, это должно решить вашу проблему.

Дополнительная информация:
Действия Laravel Nova — пакетная обработка заданий
Laravel Queues — пакетная обработка заданий

Другие вопросы по тегам