0
votes

Quêtes de Laravel: Comment traiter un ensemble d'emplois uniquement après le traitement d'un autre ensemble d'emplois?

J'ai deux séries d'emplois:

  • SET1: Job A, Job B, Job C
  • Set 2: Job D, Job e, Job F

    Comment puis-je traiter tous les travaux dans set1 , puis traiter les travaux dans set2 ?

    J'ai essayé chaînage d'emploi . Mais la chaîne de travail arrête de traiter les travaux si son emploi précédent est échoué. Je veux les traiter tous même si l'un d'entre eux est échoué.

    Il devrait traiter tous les travaux dans Set1 (A, B, C) et le processus de B et C ne devrait pas arrêter si le processus de travail a échoué. Lorsque tous les emplois de Set1 sont traités (peu importe l'échec ou non réussi), il devrait récupérer des travaux dans set2 à traiter.

    L'ordre des emplois n'est pas une priorité ici. Ils peuvent être traités dans n'importe quel ordre.
    La règle seule est que les travaux dans Set2 ne doivent être traités qu'après tous les travaux de Set1 sont traités.

    Je ne peux pas travailler avec Dispatch différé car le temps nécessaire pour traiter Set1 d'emplois varie très fortement.


0 commentaires

3 Réponses :


0
votes

Le chute d'emploi à Laravel est basé sur le fait qu'il n'exécutera pas les prochains emplois si l'on écrit actuellement.

Vous pouvez utiliser des événements. Chaque travail a 2 méthodes poignée () code> et échec () code>. Vous pouvez émettre des événements soit lorsque le travail est exécuté avec succès ou qu'il est échoué. Voir l'exemple ci-dessous: p>

Par exemple: P>

<?php

namespace App\Jobs;

use Exception;
use App\Something;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class JobA implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    protected $something;

    /**
     * Create a new job instance.
     *
     * @param  Something $somethin
     * @return void
     */
    public function __construct(Something $something)
    {
        $this->something = $something;
    }

    /**
     * Execute the job.
     *
     * @param  AudioProcessor  $processor
     * @return void
     */
    public function handle()
    {
        // Execute Job on something
        event(new JobAHandled($something));
    }

    /**
     * The job failed to process.
     *
     * @param  Exception  $exception
     * @return void
     */
    public function failed(Exception $exception)
    {
        // Send user notification of failure, etc...
        event(new JobAFailed($something, $e));
    }
}


4 commentaires

Cela émettra des événements pour le travail spécifique. Comment puis-je savoir que tous les travaux de l'ensemble spécifique sont traités? Ce que j'essaie d'atteindre est le processus d'emploi D, E, F uniquement après que les emplois A, B, C sont traités.


@SrinatheddyDudi Avez-vous déjà trouvé une solution à ce problème?


@Isaiahiroko Non. Le plus proche que je puisse arriver, c'est retarder le traitement de SET 2 emplois avec le maximum de délai défini 1 emplois à compléter.


merci @srinathreddydudi. Pourrait tomber à cela finalement.



0
votes

Une idée serait de créer un emploi jobset et un travail d'emploi d'emploi.

Donc, le jeu d'emploi prend votre nouveau travail professionnel ("A"), Jobworker ("B"), Jobworker ("C") comme argument, puis les envoie tous. xxx

et le travail "jobset" pour inspiration xxx


1 commentaires

Je pense que cela consiste à envoi d'un ensemble d'emplois. Ma question est de savoir comment traiter un ensemble d'emplois spécifique uniquement après que tous les travaux de l'ensemble précédent soient traités?



0
votes

Vous pouvez les expédier à différentes files d'attente: xxx pré>

et exécuter un travailleur qui garantit que Set1 est vide avant de vérifier SET2: P>

php artisan queue:work --queue=high,low


2 commentaires

Cela fonctionne pour une seule instance de chaque ensemble. Par exemple, s'il y a dix utilisateurs et ils ont envoyé des instances différentes de SET1 et SET2, les travaux de SET2 ne seront traités que si la file d'attente SET1 est vide. Cela signifie que les travaux de SET2 devraient attendre que tous les travaux de SET1 soient traités. Cela rend tous les travaux dans la file d'attente de chaque utilisateur pour attendre que tous les travaux de la file d'attente SET1 soient traités. Je souhaite qu'ils traitent les travaux dès que tous les travaux de Set1 File d'attente sont traités qui appartiennent à cet utilisateur. Pas avant que tous les travaux de Set1 File d'attente soient traités.


@SrinathreddyDudi Cela pourrait aider à mettre à jour la question, car il n'y a aucune mention des files d'attente en cours d'utilisateur. Si je vous comprends correctement, je ne peux pas imaginer pourquoi vous voudriez le faire de cette façon; Un exemple spécifique de la raison pour laquelle il doit fonctionner de cette façon pourrait être utile. Pourquoi la commande comporte-t-elle du tout si SET2 Les travaux d'un utilisateur spécifique sont autorisés à traiter, que leur SET1 a réussi? Si d'autres utilisateurs ajout de SET1 emplois sont retarder les travaux SET2 à partir de la transformation, vous ne pouvez pas simplement commencer plus de travailleurs afin que la file d'attente ne soit pas constamment pleine?