sql >> Database teknologi >  >> NoSQL >> Redis

Skub til Laravel-kø fra uden for Laravel (NodeJS)

Bemærk først, at dette er formatet på jobs i den databasebaserede kø i Laravel 5.3. Nyere versioner af Laravel indeholder ændringer.

Nyttelastkolonnen skal indeholde et json-objekt i følgende format. Jobbet (...\\[email protected] ) kan hårdkodes i dette scenarie. Jeg tror, ​​at kommandonavn-tasten kun er til visningsformål. Kommandotasten er dog den sværeste del, den burde være et gyldigt objekt, som unserialize() understøtter. Det ser ud til, at der er tilgængelige pakker på npm til dette formål, en hurtig søgning viste php-serialisering.

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

Den json-nyttelast, du har angivet, resulterer i følgende objekt. Både jobbet og datanøglerne er vigtige.

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

Den problematiske del, formoder jeg, er det serialiserede objekt. Omformateret på en måde, der er nemmere at læse (men bryder den fuldstændig) ...

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

Dette format afslører det faktum, at dit job bruger SerializesModels-egenskaben, der erstatter referencer til modeller som en simpel indgang, der indeholder klasse+identifikator, og vil gendanne dem under __wakeup.

Jeg tror, ​​dit problem er med den mentale parsing af json og serialiseringsformatet; din gættede struktur er ... forkert.

De næste skridt ville ikke være at gætte noget.1. Dupliker denne nøjagtige testmeddelelse, som du allerede har nyttelasten til. Bare copy-paste det. (Du skal muligvis ændre id'et, jeg tror det bruges til deduplikering.)2. Byg begivenhedsdataene ved hjælp af php-serialisering og sigt på at bygge noget, der er identisk med den oprindelige begivenheds nyttelast. Ingen ændringer overhovedet.3. Hvis det virker så langt, er du velkommen til at ændre de serialiserede hændelsesdata for at se, hvad der sker.



  1. Sådan får du tilbagekald, når nøglen udløber i REDIS

  2. BsonSerializationException ved serialisering af en ordbog<DateTime,T> til BSON

  3. Hvordan bestiller MongoDB deres dokumenter i én samling?

  4. Brug venligst 'MongoMappingContext#setAutoIndexCreation(boolean)' eller tilsidesæt 'MongoConfigurationSupport#autoIndexCreation()' for at være eksplicit