【问题标题】:Laravel. Common queue for two projects拉拉维尔。两个项目的公共队列
【发布时间】:2020-01-11 21:58:56
【问题描述】:

我有两个不同的项目。 Laravel 项目 A 和 Laravel 项目 B。 我需要通过队列从项目 A 到项目 B 创建任务。 我不想在项目 A 中为此创建工作。

目前我的认识是:

项目 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怎么办?

【问题讨论】:

    标签: php laravel laravel-5.2


    【解决方案1】:

    如果您将两个 laravel 应用程序连接到同一个队列服务器。您可以将作业放在其他站点队列中。例如,如果你在 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);
    

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

    【讨论】:

    • 您好,来自俄罗斯的阿根廷 :) 感谢您的回答。目前我使用这种方法。
    • @Kolovious me podrías dar una mano en algo similar que estoy haciendo?
    • @JuanPabloB escribime por privado y lo vemos
    • @Kolovious entro a tu perfil y no puedo enviar mensaje privado, no encuentro!
    • 当你派遣工作'App\Jobs\JobInLaravelB'时,你的意思是应该在LaravelB中创建“JobInLaravelB”吗? JobInLaravelB 驻留在哪里?
    【解决方案2】:

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

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

    如果您将 SQS 用于队列,我的 custom SQS connector 可以帮助您。否则,您将不得不自己编写一个。

    【讨论】:

      【解决方案3】:

      怎么样(虽然这完全是 hack),创建一个包含一堆 Job 类和一堆 Job-handler 类的 composer 项目,例如:

      <?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()
          {
      
          }
      }
      

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-02-06
          • 2015-08-24
          • 2018-05-23
          • 2018-02-04
          • 2017-08-10
          • 1970-01-01
          • 2018-03-06
          • 1970-01-01
          相关资源
          最近更新 更多