sobirjonovs/laravel-rabbit

RabbitMQ工作简易工具

2.9.8 2024-08-10 13:47 UTC

README

Total Downloads Latest Stable Version License Community

安装

composer require sobirjonovs/laravel-rabbit

安装包后,使用rabbit:install Artisan命令发布其资产。

php artisan rabbit:install

设置

  • config/amqp.php - RabbitMQ设置
  • config/rabbit_events.php - 编写负责从另一个微服务发出的事件的方法
  • app/Providers/RabbitServicePRovider - 编写在运行时声明的队列

示例

1. 消费消息

<?php

use App\Rabbitmq\Rabbit\Client;
use PhpAmqpLib\Message\AMQPMessage;
    
$client = app(Client::class);
$client->consume('queue-one', function (AMQPMessage $message) {
            /**
             * Acknowledge a message
             */
            $message->ack(true);
            
            /**
             * @var Client $this
             */
            $this->dispatchEvents($message);
        })->wait(); // or waitForever();

?>

2. 发布消息

<?php

use App\Rabbitmq\Rabbit\Client;
use PhpAmqpLib\Message\AMQPMessage;
    
$client = app(Client::class);
$client->setMessage([
            'method' => $method,
            'params' => $object->all()
])->publish('queue-one');

?>

3. 同时发布和消费消息

<?php

use App\Rabbitmq\Rabbit\Client;
use PhpAmqpLib\Message\AMQPMessage;
    
$client = app(Client::class);
$result = $client->setMessage([
            'method' => 'methodName',
            'params' => ['param1' => 'value1']
])->request()->getResult(); # you can pass a queue name inside a request method, otherwise it uses the default queue

?>

开发

您可以在config/rabbit_events.php中注册您的事件,如下所示

<?php

use App\Rabbitmq\Dto\Products\ProductServiceObject;
use App\Rabbitmq\Services\ProductService;

return [
    'createProduct' => [
        'class' => ProductService::class,
        'method' => 'createProduct',
        'dto' => ProductServiceObject::class
    ]
];

现在您需要一个新服务类和DTO(数据传输对象)类。

要创建一个具有函数的新服务类,请使用以下命令

php artisan make:rabbit-service ProductService createProduct

这将创建一个名为ProductService的新服务类,其中包含名为createProduct的函数。

它还创建了一个DTO类,该类将在createProduct函数中使用。

生成的文件将位于以下目录中

  • 服务类:App/Services/ProductService.php
  • 数据传输对象(DTO):App/Services/Dto/ProductServiceObject.php

如果您想更改服务类和DTO类的命名空间,您可以在config/amqp.php中替换它们。

<?php
    .
    .
    .
    /**
     * Namespace of data service classes
     *
     * It will be merged to root namespace which is App/config('amqp.service_namespace')
     */
    'service_namespace' => 'Services',

    /**
     * Namespace of data transfer object
     *
     * It will be merged to root namespace which is App/config('amqp.service_namespace')/config('amqp.dto_namespace')
     */
    'dto_namespace' => 'Dto',
];

附加

当应用程序接收消息时,如果发生异常。

该消息将被发送到dead-letter-queue,即config('amqp.dead_letter_queue')

如果消息未通过验证,则将消息发送到invalid-queue-letter,即config('amqp.invalid_letter_queue')

如果您在'config/amqp.php'文件中未定义invalid_letter_queue,则消息将被删除。

注意:这两种选项仅在发布者和订阅者模式中工作。

<?php
    .
    .
    . 
    /**
     * When error is out in service class, that message will be sent to config('amqp.dead-letter-queue')
     *
     * This works only subscriber and publisher mode
     */
    'dead_letter_queue' => 'dead-letter-queue',

    /**
     * When message cannot pass validation, the message will be sent to this queue
     * If name of this queue is null, the message will be deleted
     *
     * This works only subscriber and publisher mode
     */
    'invalid_letter_queue' => null,
];

队列

您需要在config/amqp.php中配置您的队列。

    ...
    'config' => [

        'default_queue' => 'default',

        'is_multi_queue' => false,

        'queues' => ['default', 'foo', 'bar'],
    ],