creatortsv/symfony-messenger-outbox-pattern

symfony-messenger 组件的出站模式

v1.1.0 2023-12-12 20:49 UTC

This package is auto-updated.

Last update: 2024-09-12 22:35:09 UTC


README

CI

此包是 symfony/messenger 组件的扩展,它实现了 事务性出站模式。它提供了一个特殊的中间件,通过出站传输将您的原始消息导航到消息代理

要求

安装

使用 composer 安装

composer require creatortsv/symfony-messenger-outbox-pattern

配置

本指南展示了如何配置 symfony messenger 组件

配置传输

# config/packages/messenger.yaml

framework:
    messenger:
      
        transports:
        ### Your default async message transport for any purpose
            async: '%env(resolve:MESSENGER_TRANSPORT_DNS)%'
        ### Outbox transport, for example:
        ### outbox: '%env(resolve:MESSENGER_TRANSPORT_DNS)%'
        ### outbox: 'doctrine://%env(resolve:DATABASE_URL)%'
        ### outbox: 'doctrine://default?table_name=outbox&queue_name=custom'
            outbox: 'doctrine://default'
        ### Advance stored outbox transport
            stored: 

    ### routing: ...

配置消息总线

# config/packages/messenger.yaml

framework:
    messenger:
        buses:
        ### Configure message bus that will be used with middleware from this package
            event.bus:
            ### Default middlewares must be enabled
                default_middleware:
                    enabled: true
                    allow_no_handlers: true
          
                middleware:
                ### Add the middleware with configured outbox transport name or/and advanced names
                ### - Creatortsv\Messenger\Outbox\Middleware\SwitchToOutboxMiddleware: [ outbox, store, logs ]
                    - Creatortsv\Messenger\Outbox\Middleware\SwitchToOutboxMiddleware: [ outbox ]
    
    ### transports: ... Outbox transport configuration

    ### routing: ...

使用方法

readonly class UserService
{
    public function __construct(
        private EntityManagerInterface $entityManager,
        private MessageBusInterface $eventBus,
    ) {
        // ...
    }
    
    public function register(User $user): void
    {
        $this->entityManager->wrapInTransaction(
            function () use ($user): void {
            /** Persist user in DB ... */
            
                $this->entityManager->flush();
                $this->eventBus->dispatch(new UserRegistered($user->id));
            },
        );
    }
}

运行出站消费者

使用出站传输名称运行消费者

php bin/console messenger:consume [name]

每个由工作进程消费的消息将自动发送到原始传输,归功于 SwitchToOutboxMiddleware