例如,我想创建两个独立的项目,它们应该通过某个队列(例如rabbitmq)进行通信。 我是否正确理解,我只需在 Producer 项目中使用空
handle()
方法创建一些作业以防止自行处理,并在 consumer 项目中创建另一个同名作业并运行 php artisan queue:listen
。所以当我在 Producer服务中执行
SomeJob::dispatch($payload);
时,rabbitmq 就会收到这份工作。之后,寻找传入消息的队列工作人员将收到消息,并在 consumer项目中相应的
handle()
中调用 SomeJob
。我对机制的理解正确吗?我忽略的主要事情是工人如何知道要调用什么 handle()
方法,特别是如果我们在不同的项目中使用不同的作业名称(是否可能)?
目前我正在项目中制作消费者机制,该机制将从队列接收消息。
最重要的是,两个应用程序都有同名的作业。生产者中的作业类只需要构造函数。处理函数仅在消费者上运行。
以下是创建发票时运行的作业示例:
作业/InvoiceCreatedJob.php。 - 关于制作人
/*
* This job is called from InvoiceObserver:
* public function created(Invoice $invoice): void
* { InvoiceCreatedJob::dispatch($invoice->toArray());}
*/
class InvoiceCreatedJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public array $data)
{}
}
作业/InvoiceCreatedJob.php。 - 对消费者
class InvoiceCreatedJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public array $data)
{}
public function handle(): void
{
//some code to handle invoice data
}
}