sql >> Base de Datos >  >> NoSQL >> Redis

Empuje a la cola de Laravel desde fuera de Laravel (NodeJS)

Primero, tenga en cuenta que este es el formato de los trabajos en la cola basada en la base de datos en Laravel 5.3. Las versiones más recientes de Laravel contienen cambios.

La columna de carga útil debe contener un objeto json del siguiente formato. El trabajo (...\\[email protected] ) puede codificarse de forma rígida en este escenario. Creo que la clave commandName es solo para fines de visualización. La tecla de comando, sin embargo, es la parte más difícil, debe ser un objeto válido que admita unserialize(). Parece que hay paquetes disponibles en npm para este propósito, una búsqueda rápida arrojó serialización de php.

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

La carga útil json que proporcionó da como resultado el siguiente objeto. Tanto el trabajo como las claves de datos son importantes.

{
  "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 parte problemática, supongo, es el objeto serializado. Reformateado de una manera que es más fácil de leer (pero lo rompe por completo)...

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

Este formato expone el hecho de que su trabajo usa el rasgo SerializesModels que reemplaza las referencias a modelos como una entrada simple que contiene clase+identificador, y los restaurará durante __wakeup.

Creo que su problema es con el análisis mental del json y el formato de serialización; tu estructura supuesta es... incorrecta.

Los próximos pasos no serían adivinar nada.1. Duplique esta notificación de prueba exacta para la que ya tiene la carga útil. Solo copia y pega. (Es posible que deba cambiar la identificación, supongo que se usa para la deduplicación). 2. Construya los datos del evento utilizando la serialización de php y apunte a construir algo idéntico a la carga útil del evento original. No hay cambios en absoluto.3. Si funciona hasta aquí, no dude en cambiar los datos de eventos serializados para ver qué sucede.