LearvelがGearmanペイロード(\Illuminate\Bus\Dispatcher
参照)を実行しようとするため、あなたが求めるものはありません。
私は同じ状況にあり、Laravelジョブクラスのラッパーcommand
を作成しました。jsonキューに入ってイベントを再キューに入れるので、これは最も良い解決策ではありませんが、既存のジョブクラスに触れる必要はありません。たぶん、経験豊富な人は実際にワイヤで再びジョブを送信せずにジョブをディスパッチする方法を知っているかもしれません。
GenerateIdentApplicationPdfJob
と呼ばれる1つの標準的なLaravelワーカークラスがあるとします。
class GenerateIdentApplicationPdfJob extends Job implements SelfHandling, ShouldQueue
{
use InteractsWithQueue, SerializesModels;
/** @var User */
protected $user;
protected $requestId;
/**
* Create a new job instance.
*
* QUEUE_NAME = 'ident-pdf';
*
* @param User $user
* @param $requestId
*/
public function __construct(User $user, $requestId)
{
$this->user = $user;
$this->requestId = $requestId;
}
/**
* Execute the job.
*
* @return void
*/
public function handle(Client $client)
{
// ...
}
}
このクラスを処理できるようにするには、独自のコンストラクタ引数を指定する必要があります。これらは私たちのjsonキューから必要なデータです。
以下はLearvel command
クラスGearmanPdfWorker
です.Gearman接続のすべての定型文を実行し、元のジョブクラスを処理できるようにするにはです。場所にすべてのことを持っ
class Kernel extends ConsoleKernel
{
protected $commands = [
// ...
\Bundle\Console\Commands\GearmanPdfWorker::class
];
// ...
、あなたが労働者を実行するためにphp artisan pdf:worker
を呼び出すことができます。
クラスGearmanPdfWorkerはコマンド{
/**
* The console command name.
*
* @var string
*/
protected $name = 'pdf:worker';
/**
* The console command description.
*
* @var string
*/
protected $description = 'listen to the queue for pdf generation jobs';
/**
* @var \GearmanClient
*/
private $client;
/**
* @var \GearmanWorker
*/
private $worker;
public function __construct(\GearmanClient $client, \GearmanWorker $worker) {
parent::__construct();
$this->client = $client;
$this->worker = $worker;
}
/**
* Wrapper listener for gearman jobs with plain json payload
*
* @return mixed
*/
public function handle()
{
$gearmanHost = env('CB_GEARMAN_HOST');
$gearmanPort = env('CB_GEARMAN_PORT');
if (!$this->worker->addServer($gearmanHost, $gearmanPort)) {
$this->error('Error adding gearman server: ' . $gearmanHost . ':' . $gearmanPort);
return 1;
} else {
$this->info("added server $gearmanHost:$gearmanPort");
}
// use a different queue name than the original laravel command, since the payload is incompatible
$queueName = 'JSON.' . GenerateIdentApplicationPdfJob::QUEUE_NAME;
$this->info('using queue: ' . $queueName);
if (!$this->worker->addFunction($queueName,
function(\GearmanJob $job, $args) {
$queueName = $args[0];
$decoded = json_decode($job->workload());
$this->info("[$queueName] payload: " . print_r($decoded, 1));
$job = new GenerateIdentApplicationPdfJob(User::whereUsrid($decoded->usrid)->first(), $decoded->rid);
$job->onQueue(GenerateIdentApplicationPdfJob::QUEUE_NAME);
$this->info("[$queueName] dispatch: " . print_r(dispatch($job)));
},
[$queueName])) {
$msg = "Error registering gearman handler to: $queueName";
$this->error($msg);
return 1;
}
while (1) {
$this->info("Waiting for job on `$queueName` ...");
$ret = $this->worker->work();
if ($this->worker->returnCode() != GEARMAN_SUCCESS) {
$this->error("something went wrong on `$queueName`: $ret");
break;
}
$this->info("... done `$queueName`");
}
}
}
クラスGearmanPdfWorker
は、このようなあなたの\Bundle\Console\Kernel
に登録する必要があります拡張しますコマンドライン経由でGearmanにジョブを1つ入れてください:gearman -v -f JSON.ident-pdf '{"usrid":9955,"rid":"ABC4711"}'
成功した操作
added server localhost:4730
using queue: JSON.ident-pdf
Waiting for job on `JSON.ident-pdf` ...
[JSON.ident-pdf] payload: stdClass Object
(
[usrid] => 9955
[rid] => ABC4711
)
0[JSON.ident-pdf] dispatch: 1
... done `JSON.ident-pdf`
Waiting for job on `JSON.ident-pdf` ...
私は戻ってきて、更新されているはずです。私はこのパッケージを見つけました:https://github.com/kristianedlund/laravel-external-queue。エッジの周りに少し荒いが、それは働いた。 SQSから未処理のjsonペイロードを取り出し、ハンドラに渡すことができます。私はIronMQのためにそれをかなり簡単に拡張しました。 – jszobody
私はそのライブラリ(rabbitmqを使用して)を実装するのに苦労しています、あなたはあなたの旅行の任意のコードサンプルに出くわしましたか?ありがとう – mils