Laravel отправляет обычную JSON в очередь - PullRequest
1 голос
/ 27 марта 2019

У меня есть 2 простых вопроса. В настоящее время я изучаю некоторую обработку событий в Laravel и хотел бы использовать RabbitMQ в качестве моего хранилища событий. Для этого я установил этот пакет для начала: https://github.com/php-enqueue/enqueue-dev

Для начала я зарегистрировал его и могу отправлять сообщения на RabbitMQ:

$job = (new Sendemail())->onQueue('email')->onConnection('interop');
dispatch($job);

Проблема, однако, в том, что Laravel помещает определенный формат в очередь, и я не могу понять, как это изменить. Пример сообщения будет:

{
    "job":"Illuminate\\\\Queue\\\\CallQueuedHandler@call",
    "data":{
        "command":"O:29:\\"Acme\\Jobs\\FooJob\\":4:{s:11:\\"fooBar\\";s:7:\\"abc-123\\";s:5:\\"queue\\";N;s:5:\\"delay\\";N;s:6:\\"\\u0000*\\u0000job\\";N;}"
    }
}

Итак, вопрос в том, как я могу это изменить? Основная причина этого заключается в том, что потребительская сторона - это даже не приложение PHP, которое также не может интерпретировать сериализованную модель PHP. Поэтому я ищу способ протолкнуть обычный объект JSON.

С другой стороны, я также хотел бы понять, как вы можете создать собственный слушатель? С слушателем происходит то же самое. Laravel пытается прочитать метод, но когда я нажимаю простой JSON, это никогда не сработает. Разве нет способа зарегистрировать обработчик по теме и выполнить дополнительную обработку полезной нагрузки сообщения внутри самого обработчика?

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Существует библиотека laravel-queue , которая работает с библиотекой php-enqueue, с которой вы связаны, чтобы сделать ее совместимой с Встроенной системой очередей Laravel , упомянутой Флорианом.

По умолчанию он все еще будет использовать сериализованный объект, но я думаю, что он может быть переопределен.Если вы посмотрите в Queue.php, createObjectPayload () в строке 130 в ядре Laravel Framework, то здесь и выполняется сериализация задания.

Если вы расширяете класс Queue в laravel-библиотека очереди, вы должны иметь возможность изменить createObjectPayload, чтобы он выглядел примерно так:

protected function createObjectPayload($job, $queue)
{
    $payload = $this->withCreatePayloadHooks($queue, [
        'displayName' => $this->getDisplayName($job),
        'job' => 'Illuminate\Queue\CallQueuedHandler@call',
        'maxTries' => $job->tries ?? null,
        'timeout' => $job->timeout ?? null,
        'timeoutAt' => $this->getJobExpiration($job),
        'data' => [
            'commandName' => $job,
            'command' => $job,
        ],
    ]);
    return array_merge($payload, [
        'data' => [
            'commandName' => get_class($job),
            'command' => json_encode(clone $job),
        ],
    ]);
}

Это должно JSON кодировать данные задания, а не сериализовать их.Возможно, вы даже сможете полностью удалить кодировку, поскольку я думаю, что она уже закодирована в JSON где-то в цепочке.

0 голосов
/ 27 марта 2019

Вы смотрели на решение Laravel для управления очередями и заданиями?

https://laravel.com/docs/5.5/queues

Если да, каковы причины вашего другого выбора?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...