我有两个不同的项目。 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
?
答案 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答案是正确的,只有两个注释:
DispatchNewJob
应该同时存在于Laravel A和B上$this->class_to_create
而不是$this->$class_to_create