sebk/small-events-swoft

Swoft跨应用事件分发器和接收器

1.0 2021-11-02 15:01 UTC

This package is not auto-updated.

Last update: 2024-09-19 02:52:06 UTC


README

Swoft跨应用事件分发器和接收器

安装

创建你的Swoft项目:http://swoft.io/docs/2.x/en/quick-start/install.html

需要包(https://github.com/sebk69/small-events-swoft

composer require sebk/small-events-swoft

文档

支持的连接器

目前仅支持RabbitMq。

未来计划支持Apache Kafka和MySQL连接器。

配置

将合约添加到您的'bean.php'以选择您的消息代理

return [
    ...
    // Small events contracts
    \Sebk\SmallEventsSwoft\Contract\SmallMessageBrokerInterface::class => [
        'class' => \Sebk\SmallEventsSwoft\RabbitMqAdapter\RabbitMqMessageBroker::class,
    ],
    ...
];

这里将使用RabbitMq消息代理。

在您的配置目录中创建一个'small_events.php'文件

<?php

use Sebk\SmallEventsSwoft\RabbitMqAdapter\Exchange;
use Sebk\SmallEventsSwoft\RabbitMqAdapter\Queue;
use Sebk\SmallEventsSwoft\Event\Config;

return [
    'applicationId' => 'myApp',
    'rabbitMq' => [
        'host' => 'localhost',
        'user' => 'guest',
        'password' => 'guest',
        'smallEventsExchange' => new Exchange(Config::EVENT_EXCHANGE, 'fanout'),
        'queues' => [
            new Queue(Config::EVENT_EXCHANGE . '.myApp', new Exchange(Config::EVENT_EXCHANGE, 'fanout'), false, true, false),
            new Queue('test', new Exchange('test', 'topic', false, true, false)),
        ],
    ],
    'consumers' => [
        new \App\Consumer\TestConsumer(),
    ]
];

applicationId必须在所有您的应用之间唯一:它将用于创建接收事件的队列。

在RabbitMq部分,您可以设置服务器主机、用户和密码。

smallEventsExchange是将在所有您的应用中用于分发事件的交换器。

在queues数组中,声明您将用于事件或消息的所有队列。第一个队列是专门用于您的事件流程的,必须声明

  • 第一个参数必须是['Sebk\SmallEventsSwoft\Event\Config::EVENT_EXCHANGE'][点][您的应用ID]
  • 第二个是事件交换的定义,必须定义为'smallEventsExchange'参数

第二个队列可以用于发送事件流程外的消息。

consumers数组必须包含消费者对象的列表,用于监听事件队列之外的所有队列(见下文了解如何创建消费者类)。

在事件流程外发送消息

有一个简单的方法可以将消息发送到其他应用

bean('smallDispatcher')->sendMessage('test', $message);

此命令将发送$message到'test'队列的交换器。

发送事件

SmallEvent类允许您创建一个将与其他所有监听应用共享的事件

$event = new SmallEvent('testEvent', ['subject' => $test]);

第一个参数是事件名称,第二个参数是事件的数据。

注意,数据必须是可序列化的JSON。

然后使用分发器将事件发送到其他应用(包括您的应用)

bean('smallDispatcher')->dispatch($event);

创建消费者

简单的消息(非事件消息)可以通过创建消费者(我们在配置部分看到的)来消费

以下是一个示例

<?php

namespace App\Consumer;

use Sebk\SmallEventsSwoft\Consumer\AbstractSmallConsumer;

class TestConsumer extends AbstractSmallConsumer
{

    public function __construct()
    {
        $this->queueName = 'test';

        parent::__construct();
    }

    public function consume($messageContent): bool
    {
        var_dump($messageContent);

        return true;
    }

}

消费者必须扩展'AbstractSmallConsumer'类并在构造函数中定义要监听的队列名称。

每当从队列接收到消息时,都会调用'message'方法。它必须返回true以确认消息。

监听队列

您必须使用以下命令来监听队列

$ bin/swoft small-events:listen --queue test

此命令将等待队列'test'的消息,并在每条消息上调用您的消费者类。

如果您不使用--queue参数,进程将监听事件。

要管理您的工人,您可以使用如Supervisor之类的工具:http://supervisord.org

事件?如何订阅

事件通过Swoft/Event标准包分发(http://swoft.io/docs/2.x/en/event/usage.html)。

以下是一个订阅我们的'testEvent'的简单示例

<?php

namespace App\Event;

use Swoft\Event\Annotation\Mapping\Subscriber;
use Swoft\Event\EventInterface;
use Swoft\Event\EventSubscriberInterface;

/**
 * @Subscriber()
 */
class TestSubscriber implements EventSubscriberInterface
{

    public static function getSubscribedEvents(): array
    {
        return [
            'testEvent' => 'handleTest',
        ];
    }

    public function handleTest(EventInterface $event)
    {
        dump($event->getParams());
    }

}