信使:同步和排队消息处理
编辑本页警告:您正在浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.1,现已不再维护。
读本页的更新版本用于Sy欧宝娱乐app下载地址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;使用欧宝娱乐app下载地址\组件\信使\处理程序\MessageHandlerInterface;类SmsNotificationHandler实现了MessageHandlerInterface{公共函数__invoke(SmsNotification$消息){/ /……做一些工作——比如发短信!}}
多亏了自动配置和SmsNotification
类型提示,Symfon欧宝娱乐app下载地址y知道这个处理程序应该被调用当SmsNotification
消息被发送。大多数情况下,这就是你所需要做的。但是你也可以手动配置消息处理程序.要查看所有已配置的处理程序,运行:
1
$PHP bin/控制台调试:messenger
发送消息
你准备好了!要分派消息(并调用处理程序),请注入messenger.default_bus
服务(透过MessageBusInterface
),就像控制器一样:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ / src /控制器/ DefaultController.php名称空间应用程序\控制器;使用应用程序\消息\SmsNotification;使用欧宝娱乐app下载地址\包\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\信使\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: []
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“异步”>% env (MESSENGER_TRANSPORT_DSN) %框架:运输><!--或expanded to configure more options --><框架:运输的名字=“异步”dsn=“% env (MESSENGER_TRANSPORT_DSN) %”><选项关键=“…”>...选项>框架:运输>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“异步”= >' % env (MESSENGER_TRANSPORT_DSN) %,//或扩展以配置更多选项“异步”= > [“dsn”= >' % env (MESSENGER_TRANSPORT_DSN) %,“选项”=> []],],],]);
将消息路由到传输
现在您已经配置了传输,而不是立即处理消息,您可以将它们配置为发送到传输:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
#配置/包/ messenger.yaml框架:信使:传输:异步:“% env (MESSENGER_TRANSPORT_DSN) %”路由:# async是上面你给传输的任何名称“消息应用\ \ SmsNotification”:异步
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:路由消息类型=“应用程序消息\ \ SmsNotification”><!--异步is whatever name you gave your transport above --><框架:发送方服务=“异步”/>框架:路由>框架:信使>框架:配置>容器>
1 2 3 4 5 6 7 8 9
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“路由”= > [// async是上面你给传输的名字“消息应用\ \ SmsNotification”= >“异步”,],],]);
多亏了这一点应用\ \ SmsNotification消息
会被送到哪里异步
传输和它的处理程序将不马上叫我来。下未匹配的任何消息路由
仍将立即处理。
您还可以通过类的父类或接口来路由类。或者向多个传输器发送消息:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9
#配置/包/ messenger.yaml框架:信使:路由:#路由扩展此示例基类或接口的所有消息“消息应用\ \ AbstractAsyncMessage”:异步“消息应用\ \ AsyncMessageInterface”:异步“我的消息\ \ ToBeSentToTwoSenders”:(异步审计)
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
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><!--route all messages that extend this example base class or interface --><框架:路由消息类型=“应用程序消息\ \ AbstractAsyncMessage”><框架:发送方服务=“异步”/>框架:路由><框架:路由消息类型=“应用程序消息\ \ AsyncMessageInterface”><框架:发送方服务=“异步”/>框架:路由><框架:路由消息类型=“我的消息\ \ ToBeSentToTwoSenders”><框架:发送方服务=“异步”/><框架:发送方服务=“审计”/>框架:路由>框架:信使>框架:配置>容器>
1 2 3 4 5 6 7 8 9 10 11
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“路由”= > [//路由扩展此示例基类或接口的所有消息“消息应用\ \ AbstractAsyncMessage”= >“异步”,“消息应用\ \ AsyncMessageInterface”= >“异步”,“我的消息\ \ ToBeSentToTwoSenders”= > [“异步”,“审计”],],],]);
讯息中的教义实体
如果需要在消息中传递Doctrine实体,最好传递实体的主键(或处理程序实际需要的任何相关信息,例如电子邮件
,等),而不是对象:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ / src /信息/ NewUserWelcomeEmail.php名称空间应用程序\消息;类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;使用欧宝娱乐app下载地址\组件\信使\处理程序\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:同步
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><!--...其他传输——><框架:运输的名字=“同步”dsn=“同步:/ /”/><框架:路由消息类型=“应用程序消息\ \ SmsNotification”><框架:发送方服务=“同步”/>框架:路由>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [/ /……其他传输“同步”= >“同步:/ /”),“路由”= > [“消息应用\ \ SmsNotification”= >“同步”,],],]);
创建自己的交通工具
如果需要从不受支持的设备发送或接收消息,还可以创建自己的传输。看到如何创建自己的信使运输.
消费消息(运行Worker)
在大多数情况下,一旦您的消息被路由,您就需要“使用”它们。你可以用信使:消费
命令:
1 2 3 4
$PHP bin/console messenger:消耗异步#使用-vv查看正在发生的事情的细节$PHP bin/console messenger:使用async -vv
第一个参数是接收者的名称(如果路由到自定义服务,则为服务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
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
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“async_priority_high”dsn=“% env (MESSENGER_TRANSPORT_DSN) %”><框架:选项><框架:队列><框架:名字>队列框架:名字>框架:队列>框架:选项>框架:运输><框架:运输的名字=“async_priority_low”dsn=“% env (MESSENGER_TRANSPORT_DSN) %”><选项关键=“queue_name”>低选项>框架:运输><框架:路由消息类型=“应用程序消息\ \ SmsNotification”><框架:发送方服务=“async_priority_low”/>框架:路由><框架:路由消息类型=“应用程序消息\ \ NewUserWelcomeEmail”><框架:发送方服务=“async_priority_high”/>框架:路由>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“async_priority_high”= > [“dsn”= >' % env (MESSENGER_TRANSPORT_DSN) %,“选项”= > [“queue_name”= >“高”,],],“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 9
、/ etc /主管/ conf.d / messenger-worker.conf(项目:messenger-consume)命令=php /path/to/your/app/bin/console messenger:consume async——time-limit=3600用户= ubuntunumprocs=2startsecs=0自动启动=真正的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
- XML
- PHP
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\Co欧宝娱乐app下载地址mponent\Messenger\Retry\RetryStrategyInterface# service: null
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“async_priority_high”dsn=“% env (MESSENGER_TRANSPORT_DSN) % ?queue_name = high_priority”><框架:retry-strategymax-retries=“3”延迟=“1000”乘数=“2”max-delay=“0”/>框架:运输>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“async_priority_high”= > [“dsn”= >' % env (MESSENGER_TRANSPORT_DSN) %,//默认配置“retry_strategy”= > [“max_retries”= >3.,//毫秒延迟“延迟”= >1000,//导致每次重试前的延迟更大//例如:1秒延迟,2秒,4秒“乘数”= >2,“max_delay”= >0,//覆盖所有这些服务//实现Symfony\Co欧宝娱乐app下载地址mponent\Messenger\Retry\RetryStrategyInterface// 'service' => null,],],],],]);
避免错误
有时,处理消息可能会失败知道是永久性的,不应该再尝试。如果你扔UnrecoverableMessageHandlingException,该消息将不会被重试。
强制重试
5.1
的RecoverableMessageHandlingException
在Symfony 5.1中引入。欧宝娱乐app下载地址
有时,处理消息一定会以某种方式失败知道是暂时的,必须重新尝试。如果你扔RecoverableMessageHandlingException,消息总是会被重试。
保存和重试失败的消息
如果消息失败,则会重试多次(max_retries
),然后会被丢弃。为了避免这种情况发生,您可以配置failure_transport
:
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10
#配置/包/ messenger.yaml框架:信使:#重试后,消息将被发送到“失败”的传输failure_transport:失败的传输:#……其他传输失败:“教义:/ /违约?queue_name =失败'
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><!--after retrying, messages will be sent to the "failed" transport --><框架:信使failure-transport=“失败”><!--...其他传输——><框架:运输的名字=“失败”dsn=“教义:/ /违约?queue_name =失败”/>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [//重试后,消息将被发送到“失败”的传输“failure_transport”= >“失败”,“传输”= > [/ /……其他传输“失败”= > [“dsn”= >“教义:/ /违约?queue_name =失败',],],],]);
在本例中,如果处理消息失败3次(默认情况下)max_retries
),然后发送至失败的
交通工具。当你可以使用信使:消费失败
要像普通传输一样使用它,您通常需要手动查看失败传输中的消息,并选择重试它们:
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
#查看失败传输中的所有消息$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#删除消息而不重新尝试它们,并在删除之前显示每条消息$PHP bin/console message:failed:remove 20 30——show-messages
5.1
的——显示消息
选项在Symfony 5.1中引入。欧宝娱乐app下载地址
如果消息再次失败,它将被重新发送回由于正常的失败传输重试规则.一旦达到最大重试,消息将被永久丢弃。
传输配置
Messenger支持许多不同的传输类型,每种类型都有自己的选项。
AMQP运输
5.1
从Symfony 5.1开始欧宝娱乐app下载地址,AMQP传输已经转移到一个单独的包。通过运行:
1
$作曲家需要symfony/amqp欧宝娱乐app下载地址-messenger
的amqp
传输配置如下所示:
1 2
# .envMESSENGER_TRANSPORT_DSN = amqp: / /客人:guest@localhost: 5672 / % 2 f /消息
要使用Symf欧宝娱乐app下载地址ony内置的AMQP传输,您需要AMQP PHP扩展。
请注意
默认情况下,传输将自动创建所需的任何交换机、队列和绑定密钥。这可以被禁用,但某些功能可能无法正常工作(如延迟队列)。
传输有许多其他选项,包括配置交换、队列绑定键等。请参阅有关欧宝体育电话连接.
您还可以通过添加在邮件上配置特定于amqp的设置AmqpStamp寄往你的信封:
1 2 3 4 5 6 7
使用欧宝娱乐app下载地址\组件\信使\桥\Amqp\运输\AmqpStamp;/ /……$属性= [];$公共汽车->调度(新SmsNotification (), (新AmqpStamp (“custom-routing-key”AMQP_NOPARAM,$属性)));
谨慎
使用者不会显示在管理面板中,因为此传输不依赖于\ AmqpQueue:消费()
这就是阻塞。有一个拦截接球手使——时限/内存限制
的选项信使:消费
命令以及信使:stop-workers
命令效率很低,因为它们都依赖于接收者无论是否找到消息都立即返回的事实。消费工作者负责迭代,直到它接收到要处理的消息和/或直到达到其中一个停止条件。因此,如果worker卡在阻塞调用中,则无法到达它的停止逻辑。
教义运输
5.1
从Symfony 5.1开始欧宝娱乐app下载地址,Doctrine传输已经转移到一个单独的包。通过运行:
1
$作曲家需要交响乐/教义传播者欧宝娱乐app下载地址
Doctrine传输可用于在数据库表中存储消息。
1 2
# .envMESSENGER_TRANSPORT_DSN =学说:/ /违约
格式为原则:/ / < connection_name >
,以防你有多个连接,并希望使用“默认”以外的一个。传输将自动创建一个名为messenger_messages
.
5.1
属性自动生成迁移的功能messenger_messages
表是在Symfony 5.1和DoctrineB欧宝娱乐app下载地址undle 2.1中引入的。
或者,要自己创建表,请设置auto_setup
选项假
而且生成迁移.
传输有许多选项:
- 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
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“async_priority_high”dsn=“% env (MESSENGER_TRANSPORT_DSN) % ?queue_name = high_priority”/><框架:运输的名字=“async_priority_low”dsn=“% env (MESSENGER_TRANSPORT_DSN) %”><框架:选项><框架:队列><框架:名字>normal_priority框架:名字>框架:队列>框架:选项>框架:运输>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“async_priority_high”= >' % env (MESSENGER_TRANSPORT_DSN) % ?queue_name = high_priority ',“async_priority_low”= > [“dsn”= >' % env (MESSENGER_TRANSPORT_DSN) %,“选项”= > [“queue_name”= >“normal_priority”]],],],]);
下面定义的选项选项
优先于DSN中定义的。
选项 | 描述 | 默认的 |
---|---|---|
table_name | 表的名称 | messenger_messages |
queue_name | 队列的名称(表中的列,用于使用一个表进行多个传输) | 默认的 |
redeliver_timeout | 重试队列中处于“处理”状态的消息前的超时(如果工作人员由于某种原因停止,将会发生这种情况,最终您应该重试该消息)-以秒为单位。 | 3600 |
auto_setup | 是否在发送/获取期间自动创建表。 | 真正的 |
复述,运输
5.1
从Symfony 5.1开始欧宝娱乐app下载地址,Redis传输已经转移到一个单独的包。通过运行:
1
$作曲家需要symfony/red 欧宝娱乐app下载地址-messenger
Redis传输使用流使消息排队。
1 2 3 4 5 6
# .envMESSENGER_TRANSPORT_DSN =复述:/ / localhost: 6379 /消息#全DSN示例MESSENGER_TRANSPORT_DSN =复述:/ / password@localhost: 6379 /信息/ sym欧宝娱乐app下载地址fony /消费者?auto_setup =真正的序列化器&dbindex = 0 = 1 &stream_max_entries = 0# Unix Socket示例MESSENGER_TRANSPORT_DSN =复述:/ / / var /运行/ redis.sock
5.1
Unix套接字DSN在Symfony 5.1中引入。欧宝娱乐app下载地址
要使用Redis传输,你需要Redis PHP扩展(>=4.3)和一个运行的Redis服务器(^5.0)。
可以通过DSN或选项
钥匙下运输进去messenger.yaml
:
选项 | 描述 | 默认的 |
---|---|---|
流 | Redis流的名称 | 消息 |
集团 | Redis消费组名称 | 欧宝娱乐app下载地址 |
消费者 | Redis中使用的消费者名 | 消费者 |
auto_setup | 自动创建Redis组? | 真正的 |
身份验证 | Redis密码 | |
delete_after_ack | 如果真正的 ,消息处理后会自动删除 |
假 |
序列化器 | 如何在Redis中序列化最终的有效载荷复述:OPT_SERIALIZER 选项) |
复述:SERIALIZER_PHP |
stream_max_entries | 流将被修剪到的最大条目数。将其设置为足够大的数字以避免丢失挂起的消息 | 0 (意思是“不修剪”) |
tls | 为连接启用TLS支持 | 假 |
redeliver_timeout | 重试被放弃的消费者拥有的挂起消息之前的超时(如果工作人员由于某种原因死亡,将会发生这种情况,最终您应该重试消息)-以秒为单位。 | 3600 |
claim_interval | 应检查挂起/放弃消息是否声明的时间间隔——以毫秒为单位 | 60000 (1分钟) |
谨慎
不应该超过一个信使:消费
命令使用相同的配置(流、组和使用者名)运行,以避免处理一次以上的消息。使用主机名
作为消费者可能往往是一个好主意。如果您正在使用Kubernetes来编排容器,请考虑使用StatefulSet
.
提示
集delete_after_ack
来真正的
(如果您使用单个组)或定义stream_max_entries
(如果您可以估计在您的情况下有多少Max条目是可接受的)以避免内存泄漏。否则,所有消息将永远保存在Redis中。
5.1
的delete_after_ack
,redeliver_timeout
而且claim_interval
在Symfony 5.1中引入了选项。欧宝娱乐app下载地址
内存传输
的内存中
传输实际上并不传递消息。相反,它在请求期间将它们保存在内存中,这对测试很有用。例如,如果你有一个async_priority_normal
传送器,你可以在测验
使用此传输的环境:
- YAML
- XML
- PHP
1 2 3 4 5
#配置/包/测试/ messenger.yaml框架:信使:传输:async_priority_normal:的内存:/ /
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
<!--config/packages/test/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“async_priority_normal”dsn=“内存:/ /”/>框架:信使>框架:配置>容器>
1 2 3 4 5 6 7 8 9 10
/ /配置/包/测试/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“async_priority_normal”= > [“dsn”= >的内存:/ /,],],],]);
然后,在测试时,消息将会不被送到真正的运输。更好的是,在测试中,您可以检查在请求期间发送的消息:
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20
/ /测试/控制器/ DefaultControllerTest.php名称空间应用程序\测试\控制器;使用欧宝娱乐app下载地址\包\FrameworkBundle\测试\WebTestCase;使用欧宝娱乐app下载地址\组件\信使\运输\InMemoryTransport;类DefaultControllerTest扩展WebTestCase{公共函数testSomething(){$客户端=静态::createClient ();/ /……$这->assertSame (200,$客户端->getResponse ()->getStatusCode ());/*@varInMemoryTransport $transport */$运输=自我:: $容器->get (“messenger.transport.async_priority_normal”);$这->assertCount (1,$运输->getSent ());}}
请注意
所有内存中
每次测试后,传输将自动重置在扩展测试类KernelTestCase或WebTestCase.
Amazon SQS
5.1
Symfony 5.1中介绍的Amazon SQS传输。欧宝娱乐app下载地址
通过以下命令安装Amazon SQS传输:
1
$需要symfony/amazon-欧宝娱乐app下载地址sqs-messenger
的SQS
传输配置如下所示:
1 2 3
# .envMESSENGER_TRANSPORT_DSN = sqs: / / AKIAIOSFODNN7EXAMPLE: j17m97ffsvoki0brifoo9a@sqs.eu amazonaws.com/messages——西- 3.# MESSENGER_TRANSPORT_DSN = sqs: / / localhost: 9494 /消息吗?sslmode =禁用
请注意
传输将自动创建所需的队列。属性可以禁用auto_setup
选项假
.
可以通过DSN或选项
钥匙下运输进去messenger.yaml
:
选项 | 描述 | 默认的 |
---|---|---|
access_key |
AWS访问密钥 | |
账户 |
AWS帐户标识符 | 凭证的所有者 |
auto_setup |
是否应该在发送/获取期间自动创建队列。 | 真正的 |
buffer_size |
需要预取的消息数 | 9 |
端点 |
SQS服务的绝对URL | https://sqs.eu-west-1.amazonaws.com |
poll_timeout |
等待新消息持续时间(以秒为单位) | 0.1 |
queue_name |
队列名称 | 消息 |
地区 |
AWS区域名称 | 一来就 |
secret_key |
AWS密钥 | |
visibility_timeout |
消息不可见的秒数(可见性超时值) | 队列的配置 |
wait_time |
长轮询持续时间(秒) | 20. |
请注意
的wait_time
参数定义了Amazon SQS在发送响应之前等待消息在队列中可用的最长时间。通过消除空响应的数量,它有助于降低使用Amazon SQS的成本。
的poll_timeout
参数定义了接收者在返回null之前应该等待的时间。它避免了阻塞其他接收器被调用。
请注意
如果队列名的后缀为.fifo
, AWS将创建一个先进先出队列.使用邮票AmazonSqsFifoStamp定义消息组ID
和消息重复数据删除ID
.
FIFO队列不支持设置每条消息的延迟,值为延迟:0
在重试策略设置中是必需的。
序列化消息
当消息被发送到(和从)传输时,它们使用PHP的本机序列化serialize ()
&unserialize ()
功能。您可以将此全局(或为每个传输)更改为实现的服务SerializerInterface:
- YAML
- XML
- PHP
12 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ messenger.yaml框架:信使:序列化器:default_serializer:messenger.transport.欧宝娱乐app下载地址symfony_serializer欧宝娱乐app下载地址symfony_serializer:格式:json背景:{}传输:async_priority_normal:dsn:#……序列化器:messenger.transport.欧宝娱乐app下载地址symfony_serializer
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:序列化器default-serializer=“messenger.transport.欧宝娱乐app下载地址symfony_serializer”><框架:symfony欧宝娱乐app下载地址-serializer格式=“json”><框架:上下文/>框架:symfony欧宝娱乐app下载地址-serializer>框架:序列化器><框架:运输的名字=“async_priority_normal”dsn=“…”序列化器=“messenger.transport.欧宝娱乐app下载地址symfony_serializer”/>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“序列化器”= > [“default_serializer”= >“messenger.transport.欧宝娱乐app下载地址symfony_serializer”,“欧宝娱乐app下载地址symfony_serializer”= > [“格式”= >json的,“背景”=> [],],],“传输”= > [“async_priority_normal”= > [“dsn”= >/ /……“序列化器”= >“messenger.transport.欧宝娱乐app下载地址symfony_serializer”,],],],]);
的messenger.transport.欧宝娱乐app下载地址symfony_serializer
是使用序列化器组件可以通过几种方式进行配置。如果你做选择使用Symfony序列化器时,您欧宝娱乐app下载地址可以通过SerializerStamp(见信封及邮票).
提示
当向另一个应用程序发送/接收消息/从另一个应用程序接收消息时,您可能需要更多地控制序列化过程。使用自定义序列化器提供该控件。看到欧宝娱乐app下载地址symfonycast的消息序列化器教程获取详细信息。
自定义处理程序
手动配置处理程序
欧宝娱乐app下载地址Symfony通常会自动查找并注册处理程序.但是,您也可以手动配置处理程序,并通过标记处理程序服务来传递一些额外的配置messenger.message_handler
- YAML
- XML
- PHP
1 2 3 4 5 6 7 8 9 10 11
#配置/ services.yaml服务:应用MessageHandler \ \ SmsNotificationHandler:标签:(messenger.message_handler)#或配置选项标签:-名称:messenger.message_handler#仅当无法通过type-hint猜出时需要处理:应用\ \ SmsNotification消息
12 3 4 5 6 7 8 9 10 11 12 13 14 15
<!--config/services.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd”><服务><服务id=“应用程序MessageHandler \ \ SmsNotificationHandler”><!--处理is only needed if it can't be guessed by type-hint --><标签的名字=“messenger.message_handler”处理=“应用程序消息\ \ SmsNotification”/>服务>服务>容器>
1 2 3 4 5 6 7 8 9
/ /配置/ services.php使用应用程序\消息\SmsNotification;使用应用程序\MessageHandler\SmsNotificationHandler;$容器->注册(SmsNotificationHandler::类)->addTag (“messenger.message_handler”, (//如果不能通过type-hint猜到,则只需要“处理”= > SmsNotification::类,]);
使用标记配置的可能选项有:
公共汽车
from_transport
处理
方法
优先级
订阅者和选项
处理程序类可以处理多条消息或通过实现来配置自身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;使用欧宝娱乐app下载地址\组件\信使\处理程序\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;使用欧宝娱乐app下载地址\组件\信使\处理程序\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]
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21 22
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:运输的名字=“async_priority_normal”dsn=“…”/><框架:运输的名字=“image_transport”dsn=“…”/><框架:路由消息类型=“应用程序消息\ \ UploadedImage”><框架:发送方服务=“image_transport”/><框架:发送方服务=“async_priority_normal”/>框架:路由>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“传输”= > [“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
使用欧宝娱乐app下载地址\组件\信使\信封;使用欧宝娱乐app下载地址\组件\信使\MessageBusInterface;使用欧宝娱乐app下载地址\组件\信使\邮票\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
12 3 4 5 6 7 8 9 10 11 12 13
#配置/包/ messenger.yaml框架:信使:公共汽车:messenger.bus.default:#禁用默认中间件default_middleware:假#和/或添加您自己的中间件:#实现Symfony\Component\Messenge欧宝娱乐app下载地址r\Middleware\MiddlewareInterface的服务id-“应用程序、中间件、MyMiddleware”-“应用程序、中间件、AnotherMiddleware”
12 3 4 5 6 7 8 9 10 11 12 13 14 16 17 18 19 20 21
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><!--default-middleware:disable the default middleware --><框架:总线的名字=“messenger.bus.default”default-middleware=“假”/><!--而且/or add your own --><框架:中间件id=“应用程序、中间件、MyMiddleware”/><框架:中间件id=“应用程序、中间件、AnotherMiddleware”/>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“公共汽车”= > [“messenger.bus.default”= > [//禁用默认中间件“default_middleware”= >假,//和/或添加你自己的“中间件”= > [“应用程序、中间件、MyMiddleware”,“应用程序、中间件、AnotherMiddleware”,],],],],]);
请注意
如果中间件服务是抽象的,则每个总线将创建该服务的不同实例。
教义中间件
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']
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
<!--config/packages/messenger.xml --><??> . xml version="1.0" encoding="UTF-8"<容器xmlns=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services”xmlns: xsi=“http://www.w3.org/2001/XMLSchema-instance”xmlns:框架=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/symfony”xsi: schemaLocation=“http://欧宝娱乐app下载地址www.oldmanjams.com/schema/dic/services //www.oldmanjams.com/schema/dic/services/services-1.0.xsd //www.oldmanjams.com/schema/dic/symfony //www.oldmanjams.com/schema/dic/symfony/symfony-1.0.xsd”><框架:配置><框架:信使><框架:总线的名字=“command_bus”><框架:中间件id=“doctrine_transaction”/><框架:中间件id=“doctrine_ping_connection”/><框架:中间件id=“doctrine_close_connection”/><!--或pass a different entity manager to any --><!--<框架:中间件id=“doctrine_transaction”><框架:argument>custom -->框架:总线>框架:信使>框架:配置>容器>
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/ /配置/包/ messenger.php$容器->loadFromExtension (“框架”, (“信使号”= > [“公共汽车”= > [“command_bus”= > [“中间件”= > [“doctrine_transaction”,“doctrine_ping_connection”,“doctrine_close_connection”,//使用另一个实体管理器[“id”= >“doctrine_transaction”,“参数”= > [“自定义”]],],],],],],]);
多总线,命令和事件总线
默认情况下,Messenger为您提供单个消息总线服务。但是,你可以任意配置,创建“命令”、“查询”或“事件”总线并控制它们的中间件。看到多个公共汽车.