sql >> Database >  >> NoSQL >> Redis

Push to Laravel wachtrij van buiten Laravel (NodeJS)

Merk eerst op dat dit het formaat is van de taken in de databasegebaseerde wachtrij in Laravel 5.3. Nieuwere versies van Laravel bevatten wijzigingen.

De payload-kolom moet een json-object met de volgende indeling bevatten. De taak (...\\[email protected] ) kan in dit scenario hard worden gecodeerd. Ik geloof dat de commandName-sleutel alleen voor weergavedoeleinden is. De opdrachtsleutel is echter het moeilijkere deel, het zou een geldig object moeten zijn dat unserialize() ondersteunt. Het lijkt erop dat er pakketten beschikbaar zijn op npm voor dit doel, een snelle zoekopdracht leverde php-serialisatie op.

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

De json-payload die u hebt opgegeven, resulteert in het volgende object. Zowel de taak als de gegevenssleutels zijn belangrijk.

{
  "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
}

Het problematische deel, neem ik aan, is het geserialiseerde object. Opnieuw geformatteerd op een manier die gemakkelijker te lezen is (maar volledig breekt) ...

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

Deze indeling laat zien dat uw taak de eigenschap SerializesModels gebruikt die verwijzingen naar modellen vervangt als een eenvoudige invoer met klasse+identificatie, en deze tijdens __wakeup zal herstellen.

Ik denk dat je probleem ligt bij het mentaal ontleden van de json en het serialisatieformaat; je geraden structuur is ... verkeerd.

De volgende stappen zijn niets raden.1. Dupliceer deze exacte testmelding waarvoor u de payload al heeft. Gewoon kopiëren en plakken. (Misschien moet u de id wijzigen, ik vermoed dat deze wordt gebruikt voor deduplicatie.)2. Bouw de gebeurtenisgegevens op met behulp van php-serialisatie en probeer iets te bouwen dat identiek is aan de oorspronkelijke lading van het evenement. Helemaal geen veranderingen.3. Als het tot nu toe werkt, kun je de geserialiseerde gebeurtenisgegevens wijzigen om te zien wat er gebeurt.



  1. Nieuwe functies voor back-upbeheer en beveiliging voor MySQL en PostgreSQL:ClusterControl Release 1.6.2

  2. Hoe werkt sorteren met een index in MongoDB?

  3. Aan de slag met Cloudera Data Platform Operational Database (COD)

  4. Mongoose verwijdert (pull) een document binnen een array, werkt niet met ObjectID