tzmudz/rabbitmq_rpc

非常简单的RabbitMQ RPC消息处理器。基于RPC示例。

v1.0.7 2020-03-05 20:38 UTC

This package is auto-updated.

Last update: 2024-09-06 06:53:24 UTC


README

stable

此软件包实现了在以下网址发布的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

用法

软件包包含两个类:ProducerConsumer

生产者

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