Laravel。两个项目的公共队列

时间:2016-06-01 21:11:21

标签: php laravel laravel-5.2

我有两个不同的项目。 Laravel项目A和Laravel项目B. 我需要从项目A创建任务到项目B到队列。 而且我不想在项目A中为此创建Job。

目前我的意识是:

项目A

有状态但没有业务逻辑的工作:

<?php

namespace App\Jobs;

use ...;

/**
 * Fake class!!!
 */
class MyJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public $queue = 'MyQueue';

    /**
     * Some state
     */
    protected $_contentId;

    public function __construct($contentId)
    {
        $this->_contentId = $contentId;
    }

    /**
     * Excess. I dont need business logic in project A.
     */
    public function handle()
    {
    }
}

我在项目A中将工作推入队列:

    ...
    $this->dispatch(
        new MyJob($this->_contentId)
    );
    ...

项目B

<?php

namespace App\Jobs;

use ...;

/**
 * Really needed class
 */
class MyJob extends Job implements ShouldQueue
{
    use InteractsWithQueue, SerializesModels;

    public $queue = 'MyQueue';

    /**
     * Some state
     */
    protected $_contentId;

    public function __construct($contentId)
    {
        $this->_contentId = $contentId;
    }

    /**
     * Here is my business logic. In Project B!
     */
    public function handle()
    {
        Artisan::call('my_command', [
            'id' => $this->_contentId,
        ]);
    }
}

那么,如何在项目A中没有MyJob

4 个答案:

答案 0 :(得分:4)

如果您将两个laravels应用程序连接到同一个队列服务器。您可以将作业放在其他站点队列中。例如,如果你在Laravel A

$job = (new Job())->onQueue('theQueueForLaravelB')
dispatch($job);

但是要完成这个,你应该做一个基本的工作,用参数数据来分配一个新工作。像:

class DispatchNewJob implements ShouldQueue
{
    use InteractsWithQueue, Queueable, SerializesModels;

    private $class_to_create;
    private $data;

    public function __construct($class_to_create, $data)
    {
        $this->class_to_create = $class_to_create;
        $this->data = $data;
    }

    public function handle()
    {
        dispatch(new $this->$class_to_create($this->data));
    }
}

因此,您现在可以将任何工作从laravel A发送到laravel B,包含任何数据。

你可以打电话

$job = (new DispatchNewJob('App\Jobs\JobInLaravelB', ['data'=>'myawesomedata'])
               ->onQueue('LaravelBQueue');
dispatch($job);

对不起我的英语,我来自阿根廷。

答案 1 :(得分:2)

Laravel期望两端(调度程序和侦听程序)运行相同的应用程序 - 以便序列化和反序列化正常工作。

开箱即用,Laravel(或Lumen)不支持普通队列消息,因此接收端可能运行不同的应用程序或框架。

如果您将SQS用于队列,我的custom SQS connector可以为您提供帮助。否则,你必须自己写一个。

答案 2 :(得分:2)

这个怎么样(虽然这完全是黑客攻击),创建一个包含一堆Job类和一堆作业处理程序类的作曲家项目,例如:

<?php

namespace Jobs;

use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;

class JobType1 implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        JobType1Handler::handle();
    }
}

class JobType1Handler
{
    public static function handle()
    {

    }
}

然后修改项目B 中的处理程序代码。因此,您将修改/ vendors文件夹中的源代码,这将使部署变得困难。

答案 3 :(得分:0)

@Kolovious答案是正确的,只有两个注释:

  1. DispatchNewJob应该同时存在于Laravel A和B上
  2. 有一个错字,应该是$this->class_to_create而不是$this->$class_to_create