dimkabelkov / rabbit-bus-bundle
dimkabelkov/rabbit-bus-bundle
README
为SOA提供多个事件监听器
Service A -> enevt -> rabbit-mq
rabbit-mq -> event -> Service B
rabbit-mq -> event -> Service C
rabbit-mq -> event -> Service ...
为Symfony 5
添加emag-tech-labs/rabbitmq-bundle
包,或为Symfony 4
添加php-amqplib/rabbitmq-bundle
包,并添加任何版本的symfony/monolog-bundle
为应用A
和B
定义环境变量
APP_NAME=app
配置和运行
配置描述
rabbit_bus
event_classes: #array all events in app
events
multiple: #bool true - 1 consumer for all events, false - consumer for event
consumers: #array events for executed in app, defined for any field multiple
producers: #array events for executed in app, for multiple = false
添加monolog通道
monolog:
handlers:
main:
...
channels:
- ...
- '%env(string:APP_NAME)%.rabbit-bus'
- ...
...
为应用A
和B
定义事件类(定义所有事件类外部存储库,例如:github.com/you-app/bus-events,并包含应用A
和B
)
<?php
namespace YouProject\Event\ExamampleEvent;
use Dimkabelkov\RabbitBusBundle\BusEvent\AbstractEvent;
class ExamampleEvent extends AbstractEvent
{
public const EXCHANGE = 'you-project.examample-event';
}
为multi: true
应用A
的配置示例
rabbit_bus
events
multiple: true
向Rabbit发送事件
use YouProject\Event\ExamampleEvent;
// Any service
protected BusService $busService;
// -----
// -----
// -----
// -----
// any method() {
$this->busService->publishBusEvent(new ExamampleEvent('event-name', 'event-id', 'event-value'));
// }
记录应用A
[2021-02-10T15:03:16.063755+03:00] app.rabbit-bus.INFO: Push event to rabbit-bus {"event-id":"event-id","event-name":"event-name","queue-exchange":"you-project.examample-event"} []
为multi: true
应用B
的配置示例
rabbit_bus
event_classes:
- YouProject\Event\ExamampleEvent
events
multiple: true
consumers:
- !php/const YouProject\Event\ExamampleEvent::EXCHANGE
为应用B
定义EventBusSubscriber
<?php
namespace App\EventListener;
use YouProject\Event\ExamampleEvent;
use Psr\Log\LoggerAwareInterface;
use Exception;
use Psr\Log\LoggerAwareTrait;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class EventBusSubscriber implements EventSubscriberInterface, LoggerAwareInterface
{
use LoggerAwareTrait;
/**
* @return array
*/
public static function getSubscribedEvents(): array
{
return [
ExamampleEvent::class => 'onExamampleEvent',
];
}
/**
* @param ExamampleEvent $event
*
* @throws Exception
*/
public function onExamampleEvent(ExamampleEvent $event)
{
$this->logger->info('Check handle event', $event->toArray());
}
}
在应用B
中添加EventBusSubscriber
App\EventListener\EventBusSubscriber:
tags:
- { name: kernel.event_subscriber }
- { name: monolog.logger, channel: '%env(string:APP_NAME)%.bus' }
运行消费者应用B
./bin/console rabbitmq:consumer rabbit-bus-events.multiple
记录应用B
[2021-02-10T15:03:16.076666+03:00] app.rabbit-bus.INFO: Run handle bus event {"event-id":"event-id","event-name":"event-name","queue-exchange":"ts-events.video.thumbnail-generate","queue-routing-key":"you-project.examample-event"} []
[2021-02-10T15:03:16.076862+03:00] app.rabbit-bus.INFO: Check handle event {...} []
[2021-02-10T15:03:16.076862+03:00] app.rabbit-bus.INFO: Complete queue task {"queue-exchange":"ts-events.video.thumbnail-generate"} []