Redis
 sql >> Base de données >  >> NoSQL >> Redis

Pousser vers la file d'attente Laravel depuis l'extérieur de Laravel (NodeJS)

Tout d'abord, notez qu'il s'agit du format des tâches dans la file d'attente basée sur la base de données dans Laravel 5.3. Les nouvelles versions de Laravel contiennent des modifications.

La colonne de charge utile doit contenir un objet JSON au format suivant. Le travail (...\\[email protected] ) peut être codé en dur dans ce scénario. Je crois que la clé commandName est uniquement à des fins d'affichage. La touche de commande, cependant, est la partie la plus difficile, elle doit être un objet valide pris en charge par unserialize(). Il semble qu'il existe des packages disponibles sur npm à cet effet, une recherche rapide a révélé php-serialization.

{
    "job": "Illuminate\\Queue\\[email protected]",
    "data": {
        "commandName": "App\\Jobs\\MyJobClass",
        "command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
    }
}

La charge utile json que vous avez fournie aboutit à l'objet suivant. Le travail et les clés de données sont importants.

{
  "job": "Illuminate\\Broadcasting\\BroadcastEvent",
  "data": {
    "event": "O:28:\"App\\Events\\NotificationEvent\":5:{s:7:\"\u0000*\u0000name\";s:12:\"notification\";s:4:\"data\";a:4:{s:4:\"testkey\";s:14:\"testval\";s:9:\"timestamp\";s:19:\"2017-02-24 11:07:48\";s:5:\"event\";s:12:\"notification\";s:5:\"class\";s:28:\"App\\Events\\NotificationEvent\";}s:10:\"\u0000*\u0000channel\";N;s:7:\"\u0000*\u0000user\";O:45:\"Illuminate\\Contracts\\Database\\ModelIdentifier\":2:{s:5:\"class\";s:8:\"App\\User\";s:2:\"id\";i:2;}s:6:\"socket\";N;}"
  },
  "id": "XuUKRTf8CTSdzaVgp2gRcvmxQqLcpBUG",
  "attempts": 1
}

La partie problématique, je présume, est l'objet sérialisé. Reformaté d'une manière qui est plus facile à lire (mais le casse totalement) ...

O:28:"App\Events\NotificationEvent":5:{
    // protected $name = 'notification'
    s:7:" * name";s:12:"notification";

    // public $data = array(...)
    s:4:"data";a:4:{
        // 'testkey => 'testval'
        s:4:"testkey";s:14:"testval";

        // 'timestamp' => '2017-02-24 11:07:48';
        s:9:"timestamp";s:19:"2017-02-24 11:07:48";

        // 'event' => 'notification';
        s:5:"event";s:12:"notification";

        // 'class' => App\Events\NotificationEvent::class;
        s:5:"class";s:28:"App\Events\NotificationEvent";
    }

    // protected $channel = null;
    s:10:"\0*\0channel";N;

    // protected $user = (instance of ModelIdentifier)
    s:7:"\0*\0user";O:45:"Illuminate\Contracts\Database\ModelIdentifier":2:{
        // public $class = App\User::class;
        s:5:"class";s:8:"App\User";

        // public $id = 2;
        s:2:"id";i:2;
    }

    // public $socket = null;
    s:6:"socket";N;
}

Ce format expose le fait que votre travail utilise le trait SerializesModels qui remplace les références aux modèles comme une simple entrée contenant classe + identifiant, et les restaurera pendant __wakeup.

Je crois que votre problème concerne l'analyse mentale du json et le format de sérialisation ; votre structure supposée est ... fausse.

Les prochaines étapes ne seraient pas de deviner quoi que ce soit.1. Dupliquez cette notification de test exacte pour laquelle vous avez déjà la charge utile. Il suffit de le copier-coller. (Vous devrez peut-être changer l'identifiant, je suppose qu'il est utilisé pour la déduplication.)2. Construisez les données d'événement à l'aide de la sérialisation php et visez à créer quelque chose d'identique à la charge utile d'événement d'origine. Aucun changement du tout.3. Si cela fonctionne jusqu'ici, n'hésitez pas à modifier les données d'événement sérialisées pour voir ce qui se passe.