tzmudz / rabbitmq_rpc
非常简单的RabbitMQ RPC消息处理器。基于RPC示例。
Requires
- php: ^7.2
- php-amqplib/php-amqplib: ^2.10
- vlucas/phpdotenv: ^3.6
This package is auto-updated.
Last update: 2024-09-06 06:53:24 UTC
README
此软件包实现了在以下网址发布的RabbitMQ RPC教程的可用实现:[https://rabbitmq.cn/tutorials/tutorial-six-php.html](https://rabbitmq.cn/tutorials/tutorial-six-php.html)。它实现了服务器端和客户端。
通过此软件包,您将能够向RabbitMQ发送消息,然后在服务器端接收此消息(处理它),最后将响应发送回客户端(生产者)。
与教程不同,此软件包设置为在RabbitMQ服务器重启后保存队列和消息。
安装
通过Composer安装包
composer require tzmudz/rabbitmq_rpc
此软件包使用由vlucas/phpdotenv
软件包提供的环境变量。您必须在根目录中创建一个包含变量的.env
文件。
RABBTIMQ_PORT=5672 RABBTIMQ_HOST=localhost RABBTIMQ_USERNAME=guest RABBTIMQ_PASSWORD=guest
因此,如果您使用的是例如Laravel,您只需将这些变量放入您的.env
应用文件中。**注意**:如果您的应用程序不使用.env
文件,请不要忘记通过执行代码来加载它们。
$dotenv = Dotenv\Dotenv::create(__DIR__); $dotenv->load();
您可以在以下位置找到更多信息:https://github.com/vlucas/phpdotenv
用法
软件包包含两个类:Producer
和Consumer
。
生产者
Producer
类负责将消息发送到RabbitMQ。在您的应用程序中创建一个新的Tzm\Rpc\Producer()
实例。作为参数,您可以设置队列名称(默认名称为default
)。
$producer = new Tzm\Rpc\Producer('long_task_queue_name');
否则,您可以通过调用setQueueName()
来设置队列名称。
$producer = new Tzm\Rpc\Producer(); $producer->setQueueName('long_task_queue_name');
最后,您必须使用消息作为参数调用方法call()
。
$producer = new Tzm\Rpc\Producer(); $producer->setQueueName('long_task_queue_name')->call($message);
其中$message
是要发送到RabbitMQ服务器的数据字符串。实际上,RPC发送消息并等待服务器提供的响应。但是,如果您不想等待服务器的响应,您可以使用withoutWaiting()
。
$producet = new Tzm\Rpc\Producer(); $producer->withoutWaiting()->call($message);
消费者
要处理队列中的消息,您需要Consumer
类。此类是抽象的。您必须创建一个新的类,该类继承自Consumer
抽象类。然后您必须实现几个方法。
handleMessage()
此方法负责处理消息。它接受$message
作为参数,例如。
public function handleMessage($message) { echo $message; }
handleError()
通常不需要,但它处理错误。如果handleMessage()
方法抛出错误,它将被传递给handleError()
方法。这样,您就可以按您希望的任何方式处理错误。例如,在Laravel中,您可以记录错误消息。
public function handleError(\Exception $e) { Log::error($e->getMessage()); }
setResults()
在消息被处理后,RabbitMQ返回一个响应消息。最初它返回true。但您可以使用setResult()
方法来设置您想要返回的数据。例如。
public function handleMessage($message) { $this->setResult('this_will_be_returned_to_Producer'); }
运行消费者
您的继承自Consumer
的消费者类应该如下所示
namespace Tzm\Rpc; class EchoMessage extends Consumer { protected function handleMessage($message) { echo $message; } protected function handleError(\Exception $e) { \Log::error($e->getMessage()); // In Laravel Log exception message } }
然后您可以运行消费者
$consumer = new EchoMessage(); $consumer->run();
就像Producer
类一样,这个类也有一个setQueueName()
方法。因此,您可以在创建新实例时设置队列名称,或者稍后通过方法设置。
控制台信息
此外,还有两个方法
consoleMessage($req)
它用于在控制台显示消息。它有一个参数$req
- 包含有关接收到的消息的所有信息。默认情况下,此方法返回字符串:New request
,因此如果新消息将被交付,控制台应打印。
[04.11 11:03:49] [NEW] New request
[04.11 11:03:49] [OK] New request
整个消息可以通过重写consoleInfo()
方法进行更改。注意!不要忘记先运行Consumer类(它将在RabbitMQ服务器上创建队列)
许可证
MIT