Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Empurre para a fila do Laravel de fora do Laravel (NodeJS)


Primeiro, observe que este é o formato dos trabalhos na fila baseada em banco de dados no Laravel 5.3. Versões mais recentes do Laravel contém alterações.

A coluna de carga útil deve conter um objeto json com o formato a seguir. O trabalho (...\\[email protected] ) pode ser codificado neste cenário. Eu acredito que a chave commandName é apenas para fins de exibição. A chave de comando, no entanto, é a parte mais difícil, deve ser um objeto válido que unserialize() suporta. Parece que existem pacotes disponíveis no npm para esse fim, uma pesquisa rápida revelou php-serialization.
{
    "job": "Illuminate\\Queue\\[email protected]",
    "data": {
        "commandName": "App\\Jobs\\MyJobClass",
        "command": "O:19:\"App\\Jobs\\MyJobClass\"... /* stuff */"
    }
}

A carga json que você forneceu resulta no objeto a seguir. Tanto o trabalho quanto as chaves de dados são 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
}

A parte problemática, presumo, é o objeto serializado. Reformatado de uma forma que é mais fácil de ler (mas quebra totalmente) ...
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;
}

Esse formato expõe o fato de que seu trabalho usa o atributo SerializaModels que substitui referências a modelos como uma entrada simples contendo classe+identificador e os restaurará durante __wakeup.

Acredito que seu problema seja com a análise mental do json e do formato serialize; sua estrutura suposta está... errada.

Os próximos passos não seriam adivinhar qualquer coisa.1. Duplique esta notificação de teste exata para a qual você já tem a carga útil. Basta copiar e colar. (Pode ser necessário alterar o id, acho que é usado para desduplicação.)2. Construa os dados do evento usando php-serialization e tente construir algo idêntico ao payload original do evento. Nenhuma mudança em tudo.3. Se funcionar até aqui, sinta-se à vontade para alterar os dados do evento serializado para ver o que acontece.