信使:同步和排队消息处理
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 4.3,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
信使:同步和排队消息处理
Messenger提供了一个消息总线,它能够发送消息,然后立即在应用程序中处理它们,或者通过稍后处理的传输(例如队列)发送它们。要更深入地了解它,请阅读Messenger组件文档.
创建消息和处理程序
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娱乐下载\组件\信使\处理程序\MessageHandlerInterface;类SmsNotificationHandler实现了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娱乐下载\组件\信使\MessageBusInterface;类DefaultController扩展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娱乐下载\组件\信使\处理程序\MessageHandlerInterface;类NewUserWelcomeEmailHandler实现了MessageHandlerInterface{私人$userRepository;公共函数__construct(UserRepository$userRepository){$这->userRepository =$userRepository;}公共函数__invoke(NewUserWelcomeEmail$welcomeEmail){$用户=$这->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用户= ubuntunumprocs=2自动启动=真正的autorestart=真正的process_name= % s_ (program_name) % (process_num)02d
改变异步
参数,以使用传输器的名称和用户
到您的服务器上的Unix用户。接下来,告诉Supervisor读取你的配置并启动你的workers:
1 2 3 4 5
$Sudo supervisor orctl重读$Sudo supervisor orctl update$Sudo 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娱乐下载\组件\信使\运输\AmqpExt\AmqpStamp;/ /……$属性= [];$公共汽车->调度(新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娱乐下载\组件\信使\运输\InMemoryTransport;类DefaultControllerTest扩展WebTestCase{公共函数testSomething(){$客户端=静态::createClient ();/ /……$这->assertSame (200,$客户端->getResponse ()->getStatusCode ());/*@varInMemoryTransport $transport */$运输=自我:: $容器->get (“messenger.transport.async_priority_normal”);$这->assertCount (1,$运输->get ());}}
请注意
所有内存中
每次测试后,传输将自动重置在扩展测试类KernelTestCase或WebTestCase.
序列化消息
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娱乐下载\组件\信使\处理程序\MessageSubscriberInterface;类SmsNotificationHandler实现了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娱乐下载\组件\信使\处理程序\MessageSubscriberInterface;类ThumbnailUploadedImageHandler实现了MessageSubscriberInterface{公共函数__invoke(UploadedImage$uploadedImage){//做一些缩略图}公共静态函数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
#在处理消息时只调用ThumbnailUploadedImageHandler$PHP bin/console messenger:consume image_transport -vv$PHP bin/console messenger:consume async_priority_normal -vv
谨慎
如果处理程序不有from_transport
Config,它将被执行每一个接收消息的传输。
延长信使
信封及邮票
消息可以是任何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)));/ /……}
在内部,每条消息都包装在信封
,用于保存消息和邮票。您可以手动创建,也可以让消息总线来创建。针对不同的目的,有各种不同的戳记,它们在内部用于跟踪关于消息的信息——比如处理消息的消息总线,或者在失败后重试消息。
中间件
将消息分派到消息总线时会发生什么,这取决于中间件的集合及其顺序。默认情况下,为每个总线配置的中间件是这样的:
add_bus_name_stamp_middleware
-添加一个戳来记录该消息被发送到哪个总线;dispatch_after_current_bus
——看事务性消息:在处理完成后处理新消息;failed_message_processing_middleware
参数处理正在重试的消息传输失败使它们正常工作,就像从原始运输中接收它们一样;- 你自己的收藏中间件;
的send_message
如果为传输配置了路由,这将发送消息到该传输并停止中间件链;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为您提供单个消息总线服务。但是,你可以任意配置,创建“命令”、“查询”或“事件”总线并控制它们的中间件。看到多个公共汽车.