信使:同步和排队消息处理

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

信使:同步和排队消息处理

Messenger提供了一个消息总线,它能够发送消息,然后立即在应用程序中处理它们,或者通过稍后处理的传输(例如队列)发送它们。要更深入地了解它,请阅读Messenger组件文档

安装

在使用ob娱乐下载Symfony Flex,执行此命令安装messenger:

1
作曲家需要信使

创建消息和处理程序

Messenger围绕您将创建的两个不同的类展开:(1)保存数据的消息类和(2)消息发送时将调用的处理程序类。处理程序类将读取消息类并执行一些任务。

对于消息类没有特定的要求,除了它可以被序列化:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /信息/ SmsNotification.php名称空间应用程序消息SmsNotification私人内容公共函数__construct(字符串内容->内容=内容;}公共函数getContent()字符串返回->内容;}}

消息处理程序是PHP可调用的,创建它的推荐方法是创建一个实现类MessageHandlerInterface并且有一个__invoke ()使用消息类(或消息接口)类型提示的方法:

12 3 4 5 6 7 8 9 10 11 12 13
/ / src / MessageHandler / SmsNotificationHandler.php名称空间应用程序MessageHandler使用应用程序消息SmsNotification使用ob娱乐下载组件信使处理程序MessageHandlerInterfaceSmsNotificationHandler实现了MessageHandlerInterface公共函数__invoke(SmsNotification消息/ /……做一些工作——比如发短信!}}

多亏了自动配置SmsNotification类型提示,Symfonob娱乐下载y知道这个处理程序应该被调用当SmsNotification消息被发送。大多数情况下,这就是你所需要做的。但是你也可以手动配置消息处理程序.要查看所有已配置的处理程序,运行:

1
PHP bin/控制台调试:messenger

发送消息

你准备好了!要分派消息(并调用处理程序),请注入message_bus服务(透过MessageBusInterface),就像控制器一样:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ DefaultController.php名称空间应用程序控制器使用应用程序消息SmsNotification使用ob娱乐下载FrameworkBundle控制器AbstractController使用ob娱乐下载组件信使MessageBusInterfaceDefaultController扩展AbstractController公共函数指数(MessageBusInterface公共汽车//将导致SmsNotificationHandler被调用公共汽车->调度(SmsNotification (“看!我创造了一条信息!”));//或使用快捷方式->dispatchMessage (SmsNotification (“看!我创造了一条信息!”));/ /……}}

传输:异步/队列消息

默认情况下,消息一经分派就立即进行处理。如果希望异步处理消息,可以配置传输。传输能够发送消息(例如到队列系统),然后通过工作人员接收它们.信使支持多种传输

请注意

如果要使用不受支持的传输,请查看排队的交通它支持Kafka、Amazon SQS和谷歌Pub/Sub等服务。

传输使用“DSN”进行注册。多亏了Messenger的Flex配方,你的.env文件中已经有了一些例子。

1 2 3
# MESSENGER_TRANSPORT_DSN = amqp: / /客人:guest@localhost: 5672 / % 2 f /消息# MESSENGER_TRANSPORT_DSN =学说:/ /违约# MESSENGER_TRANSPORT_DSN =复述:/ / localhost: 6379 /消息

取消注释您想要的任何传输(或将其设置为.env.local).看到信使:同步和排队消息处理欲知详情。

接下来,在配置/包/ messenger.yaml,让我们定义一个名为异步使用这样的配置:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ messenger.yaml框架:信使:传输:异步:“% env (MESSENGER_TRANSPORT_DSN) %”#或展开以配置更多选项#异步:# dsn: "%env(MESSENGER_TRANSPORT_DSN)%"# options: []

将消息路由到传输

现在您已经配置了传输,而不是立即处理消息,您可以将它们配置为发送到传输:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
#配置/包/ messenger.yaml框架:信使:传输:异步:“% env (MESSENGER_TRANSPORT_DSN) %”路由:# async是上面你给传输的任何名称“消息应用\ \ SmsNotification”异步

多亏了这一点应用\ \ SmsNotification消息会被送到哪里异步传输和它的处理程序将马上叫我来。下未匹配的任何消息路由仍将立即处理。

您还可以通过类的父类或接口来路由类。或将消息发送到多个传输:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
#配置/包/ messenger.yaml框架:信使:路由:#路由扩展此示例基类或接口的所有消息“消息应用\ \ AbstractAsyncMessage”异步“消息应用\ \ AsyncMessageInterface”异步“我的消息\ \ ToBeSentToTwoSenders”(异步审计)

讯息中的教义实体

如果需要在消息中传递Doctrine实体,最好传递实体的主键(或处理程序实际需要的任何相关信息,例如电子邮件,等),而不是对象:

12 3 4 5 6 7 8 9 10 11 12 13 14
NewUserWelcomeEmail私人用户标识公共函数__construct(int用户标识->用户id =用户标识;}公共函数getUserId()int返回->用户标识;}}

然后,在你的处理程序中,你可以查询一个新对象:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src / MessageHandler / NewUserWelcomeEmailHandler.php名称空间应用程序MessageHandler使用应用程序消息NewUserWelcomeEmail使用应用程序存储库UserRepository使用ob娱乐下载组件信使处理程序MessageHandlerInterfaceNewUserWelcomeEmailHandler实现了MessageHandlerInterface私人userRepository公共函数__construct(UserRepositoryuserRepository->userRepository =userRepository;}公共函数__invoke(NewUserWelcomeEmailwelcomeEmail用户->userRepository->找到(welcomeEmail->getUserId ());/ /……发送电子邮件!}}

这保证了实体包含新的数据。

同步处理消息

如果一个消息没有匹配任何路由规则,它不会被送往任何运输工具,会立即处理。在某些情况下(比如当将处理程序绑定到不同的传输)时,显式地处理它会更容易或更灵活:通过创建一个同步传输和“发送”要立即处理的消息:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ messenger.yaml框架:信使:传输:#……其他传输同步:“同步:/ /”路由:应用程序消息\ \ SmsNotification:同步

创建自己的交通工具

如果需要从不受支持的设备发送或接收消息,还可以创建自己的传输。看到如何创建自己的信使运输

消费消息(运行Worker)

在大多数情况下,一旦您的消息被路由,您就需要“使用”它们。你可以用信使:消费命令:

1 2 3 4
PHP bin/console messenger:消耗异步#使用-vv查看正在发生的事情的细节PHP bin/console messenger:使用async -vv

4.3

信使:消费command在Symfony 4.3中被重命ob娱乐下载名(以前它被称为信使:使用消息).

第一个参数是接收者的名称(如果路由到自定义服务,则为服务id)。默认情况下,该命令将永远运行:在传输上查找新消息并处理它们。这个命令叫做“worker”。

部署到生产环境

在制作过程中,有一些重要的事情需要考虑:

使用Supervisor让你的工作人员保持运行
您将希望一个或多个“工作人员”始终运行。要做到这一点,使用过程控制系统,如主管
不要让员工永远跑掉
一些服务(如Doctrine的EntityManager)会随着时间的推移消耗更多的内存。所以,与其让你的工作线程一直运行,不如使用一个标志信使:消费——限制= 10告诉你的工作人员在退出前只处理10条消息(然后Supervisor将创建一个新进程)。还有其他的选择,比如——内存限制= 128而且——期限= 3600
在部署时重新启动worker
每次部署时,您都需要重新启动所有工作进程,以便它们能够看到新部署的代码。要做到这一点,运行信使:stop-workers在部署。这将向每个worker发出信号,提示它应该完成当前正在处理的消息并优雅地关闭。然后,Supervisor将创建新的工作进程。该命令使用应用程序内部缓存—因此请确保将其配置为使用您喜欢的适配器。

优先传输

有时某些类型的消息应该具有更高的优先级,并在其他消息之前处理。为了实现这一点,您可以创建多个传输,并将不同的消息路由到它们。例如:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#配置/包/ messenger.yaml框架:信使:传输:async_priority_high:dsn:' % env (MESSENGER_TRANSPORT_DSN) %选项:# queue_name是特定于传输原则的queue_name:#为AMQP发送到单独的交换机,然后排队#交换:#名称:高#队列:# messages_high: ~#或redis尝试“组”async_priority_low:dsn:' % env (MESSENGER_TRANSPORT_DSN) %选项:queue_name:路由:“消息应用\ \ SmsNotification”async_priority_low“消息应用\ \ NewUserWelcomeEmail”async_priority_high

然后,您可以为每个传输运行单独的worker,或者指示一个worker按优先级顺序处理消息:

1
PHP bin/console messenger:consume async_priority_high async_priority_low

工作人员总是首先寻找等待的消息async_priority_high.如果没有,然后它将使用来自的消息async_priority_low

主管配置

监控器是一个很好的工具,可以保证您的工作进程正常运行总是运行(即使由于失败、达到消息限制或由于信使:stop-workers).你可以在Ubuntu上安装它,例如,通过:

1
Sudo apt-get安装管理器

管理器配置文件通常位于/etc/supervisor/conf.d目录中。例如,您可以创建一个新的messenger-worker.conf文件来确保有两个实例信使:消费一直在运行:

1 2 3 4 5 6 7 8
、/ etc /主管/ conf.d / messenger-worker.conf(项目:messenger-consume)命令=php /path/to/your/app/bin/console messenger:consume async——time-limit=3600用户= ubuntunumprocs2自动启动真正的autorestart真正的process_name= % s_ (program_name) % (process_num)02d

改变异步参数,以使用传输器的名称和用户到您的服务器上的Unix用户。接下来,告诉Supervisor读取你的配置并启动你的workers:

1 2 3 4 5
Sudo supervisor orctl重读Sudo supervisor orctl updateSudo monitorctl start message -consume:*

看到主管医生欲知详情。

重试和失败

如果在使用来自传输的消息时抛出异常,则该异常将自动重新发送到传输以再次尝试。缺省情况下,一条消息将被重试3次才被丢弃或丢弃发送到故障传输.每次重试也将被延迟,如果失败是由于临时问题。所有这些对于每个传输都是可配置的:

  • YAML
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#配置/包/ messenger.yaml框架:信使:传输:async_priority_high:dsn:' % env (MESSENGER_TRANSPORT_DSN) %#默认配置retry_strategy:max_retries:3.#毫秒延迟延迟:1000#导致每次重试前的延迟更高#例:1秒延迟,2秒,4秒乘数:2max_delay:0#覆盖所有这些服务#实现Symfony\Coob娱乐下载mponent\Messenger\Retry\RetryStrategyInterface# service: null

避免错误

有时,处理消息可能会失败知道是永久性的,不应该再尝试。如果你扔UnrecoverableMessageHandlingException,该消息将不会被重试。

保存和重试失败的消息

如果消息失败,则会重试多次(max_retries),然后会被丢弃。为了避免这种情况发生,您可以配置failure_transport

  • YAML
1 2 3 4 5 6 7 8 9 10
#配置/包/ messenger.yaml框架:信使:#重试后,消息将被发送到“失败”的传输failure_transport:失败的传输:#……其他传输失败:“教义:/ /违约?queue_name =失败'

在本例中,如果处理消息失败3次(默认情况下)max_retries),然后发送至失败的交通工具。当你可以使用信使:消费失败要像普通传输一样使用它,您通常需要手动查看失败传输中的消息,并选择重试它们:

12 3 4 5 6 7 8 9 10 11 12 13 14
#查看失败传输中的所有消息PHP bin/console messenger:failed:show#查看有关特定故障的详细信息PHP bin/console message:failed:show 20 -vv#逐个查看和重试消息PHP bin/console message:failed:retry -vv . txt#重试特定消息PHP bin/console message:failed:retry 20 30——force#删除消息而不重新尝试它PHP bin/console messenger:failed:remove 20

如果消息再次失败,它将被重新发送回由于正常的失败传输重试规则.一旦达到最大重试,消息将被永久丢弃。

传输配置

Messenger支持许多不同的传输类型,每种类型都有自己的选项。

AMQP运输

amqp传输配置如下所示:

1 2
# .envMESSENGER_TRANSPORT_DSN = amqp: / /客人:guest@localhost: 5672 / % 2 f /消息

要使用Symfob娱乐下载ony内置的AMQP传输,您需要AMQP PHP扩展。

请注意

默认情况下,传输将自动创建所需的任何交换机、队列和绑定密钥。这可以被禁用,但某些功能可能无法正常工作(如延迟队列)。

传输有许多其他选项,包括配置交换、队列绑定键等。请参阅有关欧宝官网下载app连接

您还可以通过添加在邮件上配置特定于amqp的设置AmqpStamp寄往你的信封:

1 2 3 4 5 6 7
使用ob娱乐下载组件信使运输AmqpExtAmqpStamp/ /……属性= [];公共汽车->调度(SmsNotification (), (AmqpStamp (“custom-routing-key”AMQP_NOPARAM,属性)));

谨慎

使用者不会显示在管理面板中,因为此传输不依赖于\ AmqpQueue:消费()这就是阻塞。有一个拦截接球手使——时限/内存限制的选项信使:消费命令以及信使:stop-workers命令效率很低,因为它们都依赖于接收者无论是否找到消息都立即返回的事实。消费工作者负责迭代,直到它接收到要处理的消息和/或直到达到其中一个停止条件。因此,如果worker卡在阻塞调用中,则无法到达它的停止逻辑。

教义运输

4.3

Doctrine传输在Symfony 4.3中引入。ob娱乐下载

Doctrine传输可用于在数据库表中存储消息。

1 2
# .envMESSENGER_TRANSPORT_DSN =学说:/ /违约

格式为原则:/ / < connection_name >,以防你有多个连接,并希望使用“默认”以外的一个。传输将自动创建一个名为messenger_messages第一次使用传输时(这是可配置的)。你可以用auto_setup方法手动设置表信使:setup-transports命令。

提示

为了避免像Doctrine Migrations这样的工具试图删除这个表,因为它不是常规模式的一部分,您可以设置schema_filter选择:

1 2 3 4
#配置/包/ doctrine.yaml原则:dbal:schema_filter:~ ^ (? ! messenger_messages) ~”

传输有许多选项:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
#配置/包/ messenger.yaml框架:信使:传输:async_priority_high:“% env (MESSENGER_TRANSPORT_DSN) % ?queue_name = high_priority”async_normal:dsn:“% env (MESSENGER_TRANSPORT_DSN) %”选项:queue_name:normal_priority

下面定义的选项选项优先于DSN中定义的。

选项 描述 默认的
table_name 表的名称 messenger_messages
queue_name 队列的名称(表中的列,用于使用一个表进行多个传输) 默认的
redeliver_timeout 重试队列中处于“处理”状态的消息前的超时(如果工作人员由于某种原因死亡,将会发生这种情况,最终您应该重试消息)-以秒为单位。 3600
auto_setup 是否在发送/获取期间自动创建表。 真正的

复述,运输

4.3

在Symfony 4.3中引入了Redis传输。ob娱乐下载

Redis传输使用使消息排队。

1 2 3 4
# .envMESSENGER_TRANSPORT_DSN =复述:/ / localhost: 6379 /消息#全DSN示例MESSENGER_TRANSPORT_DSN =复述:/ / password@localhost: 6379 /信息/ symob娱乐下载fony /消费者?auto_setup =真正的序列化器= 1

要使用Redis传输,你需要Redis PHP扩展(^4.3)和一个运行的Redis服务器(^5.0)。

谨慎

Redis传输不支持“延迟”消息。

可以通过DSN或选项钥匙下运输进去messenger.yaml

选项 描述 默认的
Redis流的名称 消息
集团 Redis消费组名称 ob娱乐下载
消费者 Redis中使用的消费者名 消费者
auto_setup 自动创建Redis组? 真正的
身份验证 Redis密码
序列化器 如何在Redis中序列化最终的有效载荷复述:OPT_SERIALIZER选项) 复述:SERIALIZER_PHP

内存传输

4.3

内存中在Symfony 4.3中引入了传输。ob娱乐下载

内存中传输实际上并不传递消息。相反,它在请求期间将它们保存在内存中,这对测试很有用。例如,如果你有一个async_priority_normal传送器,你可以在测验使用此传输的环境:

1 2 3 4 5
#配置/包/测试/ messenger.yaml框架:信使:传输:async_priority_normal:的内存:/ / /

然后,在测试时,消息将会被送到真正的运输。更好的是,在测试中,您可以检查在请求期间发送的消息:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ /测试/ DefaultControllerTest.php名称空间应用程序测试使用ob娱乐下载FrameworkBundle测试WebTestCase使用ob娱乐下载组件信使运输InMemoryTransportDefaultControllerTest扩展WebTestCase公共函数testSomething()客户端静态::createClient ();/ /……->assertSame (200客户端->getResponse ()->getStatusCode ());/*@varInMemoryTransport $transport */运输自我:: $容器->get (“messenger.transport.async_priority_normal”);->assertCount (1运输->get ());}}

请注意

所有内存中每次测试后,传输将自动重置扩展测试类KernelTestCaseWebTestCase

序列化消息

4.3

在4.3中,默认的序列化器从Symfony序列化器变成了原生的PHP序列化器。ob娱乐下载现有的应用程序应该配置它们的传输以使用Symfony序列化器,以避免在升级后丢失已经排队的消息。ob娱乐下载

当消息被发送到(和从)传输时,它们使用PHP的本机序列化serialize ()unserialize ()功能。您可以将此全局(或为每个传输)更改为实现的服务SerializerInterface

  • YAML
12 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ messenger.yaml框架:信使:序列化器:default_serializer:messenger.transport.ob娱乐下载symfony_serializerob娱乐下载symfony_serializer:格式:json背景:传输:async_priority_normal:dsn:#……序列化器:messenger.transport.ob娱乐下载symfony_serializer

messenger.transport.ob娱乐下载symfony_serializer是使用序列化器组件可以通过几种方式进行配置。如果你选择使用Symfony序列化器时,您ob娱乐下载可以通过SerializerStamp(见信封及邮票).

自定义处理程序

手动配置处理程序

ob娱乐下载Symfony通常会自动查找并注册处理程序.但是,您也可以手动配置处理程序,并通过标记处理程序服务来传递一些额外的配置messenger.message_handler

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13
#配置/ services.yaml服务:应用MessageHandler \ \ SmsNotificationHandler:标签:(messenger.message_handler)#或配置选项标签:-名称:messenger.message_handler#仅当无法通过type-hint猜出时需要处理:应用\ \ SmsNotification消息这里支持getHandledMessages()返回的# options

订阅者和选项

处理程序类可以处理多条消息或通过实现来配置自身MessageSubscriberInterface

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
/ / src / MessageHandler / SmsNotificationHandler.php名称空间应用程序MessageHandler使用应用程序消息OtherSmsNotification使用应用程序消息SmsNotification使用ob娱乐下载组件信使处理程序MessageSubscriberInterfaceSmsNotificationHandler实现了MessageSubscriberInterface公共函数__invoke(SmsNotification消息/ /……公共函数handleOtherSmsNotification(OtherSmsNotification消息/ /……公共静态函数getHandledMessages()可迭代的//在__invoke上处理此消息收益率SmsNotification::类;//在handleOtherSmsNotification上处理此消息收益率OtherSmsNotification::Class => [“方法”= >“handleOtherSmsNotification”//'priority' => 0,//'bus' => ' message .bus.default',];}}

将处理程序绑定到不同的传输

每个消息可以有多个处理程序,以及当使用消息时所有的处理程序调用。但也可以配置处理程序,使其仅在从具体的交通工具。这允许您拥有一个单独的消息,其中每个处理程序由使用不同传输的不同“工作者”调用。

假设你有一个UploadedImage带有两个处理程序的消息:

  • ThumbnailUploadedImageHandler:您希望由名为image_transport
  • NotifyAboutNewUploadedImageHandler:您希望由名为async_priority_normal

要做到这一点,请添加from_transport每个处理程序的选项。例如:

12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src / MessageHandler / ThumbnailUploadedImageHandler.php名称空间应用程序MessageHandler使用应用程序消息UploadedImage使用ob娱乐下载组件信使处理程序MessageSubscriberInterfaceThumbnailUploadedImageHandler实现了MessageSubscriberInterface公共函数__invoke(UploadedImageuploadedImage//做一些缩略图公共静态函数getHandledMessages()可迭代的收益率UploadedImage::Class => [“from_transport”= >“image_transport”,);}}

类似的:

12 3 4 5 6 7 8 9 10 11 12 13 14
/ / src / MessageHandler / NotifyAboutNewUploadedImageHandler.php/ /……NotifyAboutNewUploadedImageHandler实现了MessageSubscriberInterface/ /……公共静态函数getHandledMessages()可迭代的收益率UploadedImage::Class => [“from_transport”= >“async_priority_normal”,);}}

然后,确保将你的信息“路由”到这两个传输:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ messenger.yaml框架:信使:传输:async_priority_normal:#……image_transport:#……路由:#……“消息应用\ \ UploadedImage”[image_transport,async_priority_normal]

就是这样!您现在可以消费每个传输:

1 2 3 4
#在处理消息时只调用ThumbnailUploadedImageHandlerPHP bin/console messenger:consume image_transport -vvPHP bin/console messenger:consume async_priority_normal -vv

谨慎

如果处理程序from_transportConfig,它将被执行每一个接收消息的传输。

延长信使

信封及邮票

消息可以是任何PHP对象。有时,您可能需要配置关于消息的一些额外的东西——比如在AMQP中处理消息的方式,或者在处理消息之前添加一个延迟。你可以通过在你的邮件中添加一个“stamp”来做到这一点:

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
使用ob娱乐下载组件信使信封使用ob娱乐下载组件信使MessageBusInterface使用ob娱乐下载组件信使邮票DelayStamp公共函数指数(MessageBusInterface公共汽车公共汽车->调度(SmsNotification (“……”), (//处理前等待5秒DelayStamp (5000)));//或显式地创建一个Envelope公共汽车->调度(信封(SmsNotification (“……”), (DelayStamp (5000)));/ /……

在内部,每条消息都包装在信封,用于保存消息和邮票。您可以手动创建,也可以让消息总线来创建。针对不同的目的,有各种不同的戳记,它们在内部用于跟踪关于消息的信息——比如处理消息的消息总线,或者在失败后重试消息。

中间件

将消息分派到消息总线时会发生什么,这取决于中间件的集合及其顺序。默认情况下,为每个总线配置的中间件是这样的:

  1. add_bus_name_stamp_middleware-添加一个戳来记录该消息被发送到哪个总线;
  2. dispatch_after_current_bus——看事务性消息:在处理完成后处理新消息
  3. failed_message_processing_middleware参数处理正在重试的消息传输失败使它们正常工作,就像从原始运输中接收它们一样;
  4. 你自己的收藏中间件
  5. 的send_message如果为传输配置了路由,这将发送消息到该传输并停止中间件链;
  6. handle_message-调用给定消息的消息处理程序。

请注意

这些中间件名称实际上是快捷方式名称。真实的服务id前缀为messenger.middleware。(如。messenger.middleware.handle_message).

中间件在消息被分派时执行,但是同样,当通过worker接收消息时(对于发送到要异步处理的传输的消息)。如果您创建自己的中间件,请记住这一点。

您可以将自己的中间件添加到此列表中,或者完全禁用默认中间件和只有包括你自己的:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/包/ messenger.yaml框架:信使:公共汽车:messenger.bus.default:中间件:#实现Symfony\Component\Messengeob娱乐下载r\Middleware\MiddlewareInterface的服务id-“应用程序、中间件、MyMiddleware”-“应用程序、中间件、AnotherMiddleware”# default_middleware:假

请注意

如果中间件服务是抽象的,则每个总线将创建该服务的不同实例。

教义中间件

1.11

以下Doctrine中间件是在DoctrineBundle 1.11中引入的。

如果你在你的应用中使用Doctrine,你可能会想要使用一些可选的中间件:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#配置/包/ messenger.yaml框架:信使:公共汽车:command_bus:中间件:#每次处理消息时,Doctrine连接#被“ping”并重新连接,如果它关闭。有用的#如果你的工作运行了很长时间,数据库#连接有时会丢失-doctrine_ping_connection#处理后,Doctrine连接关闭,#可以释放一个worker中的数据库连接,#而不是让它们永远打开-doctrine_close_connection#将所有处理程序包装在单个Doctrine事务中#处理程序不需要调用flush()和错误#将导致回滚-doctrine_transaction#或将不同的实体管理器传递给任何#- doctrine_transaction: ['custom']

“信使号”事件

除了中间件之外,Messenger还分派几个事件。你可以创建事件监听器以钩进过程的各个部分。对于每个事件,事件类是事件名称:

多总线,命令和事件总线

默认情况下,Messenger为您提供单个消息总线服务。但是,你可以任意配置,创建“命令”、“查询”或“事件”总线并控制它们的中间件。看到多个公共汽车

此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。