Laravel排队事件监听器与作业之间的区别

时间:2017-03-16 08:31:21

标签: laravel laravel-5 queue event-listener

我试图围绕Laravel的queued event listener vs jobs

对我而言,似乎两者非常相似:

  1. 两者都实现ShouldQueue接口(在事件监听器的情况下,这是一个选项)
  2. 两者都实施handle()failed()(可选)方法来执行各自的任务。
  3. 基本上,对我来说,两者都是可以异步运行的排队项目。

    到目前为止,我能够区分的是,作业有更多"高级" 功能/配置,例如$timeout$tries属性,您可以也延迟了“触发器”工作(由Illuminate\Bus\Queueable特质提供)。

    我确信还有更多,但我指出了那个突然出现的那个。

    所以,问题是,两者之间的实际差异是什么,更重要的是,你何时优先于另一方?

2 个答案:

答案 0 :(得分:1)

好问题,我将从laravel docs如何解释它开始

事件:Laravel的事件提供了一个简单的观察者实现,允许您订阅和侦听应用程序中发生的各种事件。事件是解耦应用程序各个方面的好方法,因为单个事件可以有多个不依赖于彼此的侦听器。

在哪里

作业:作业类非常简单,通常只包含一个句柄方法,当队列处理作业时会调用该方法。

基本上两者都是把工作推到队列和/或做一些处理它要求做的事情,我要说的主要区别是如何调用它们。

事件在了望台上被称为,其中乔布斯始终明确地称为

事件的力量是我们可以为单个事件注册 多个侦听器 事件助手会将事件分派给所有已注册的事件听众 ,我们没有将他们称为 。在乔布斯的情况下,我们必须明确地将它们称为每一个。

简而言之,如果您有一个事件会触发多个方法调用事件会有所帮助。如果它的单一方法调用乔布斯是好的。

活动场景:用户注册 - >发送电子邮件,Dispatch免费赃物,为用户个人资料userxyz.site.com等创建子域名

职位情景:用户注册 - >发送电子邮件。

答案 1 :(得分:1)

嗯,它们非常相似,eventlistener在handle方法中将事件作为参数,而作业则没有。

在要将触发部分与操作部分分离的情况下,事件很好。例如,当您在项目中有多个模块,而您希望一个模块对另一个事件做出反应时。

工作相比,事件的一个限制是工作链。例如,如果您从某个控制器触发了多个事件,则不能确定该工作程序是按顺序分派这些事件的,并且第一个事件是在另一个事件开始之前完成的。

在这些(罕见)情况下,有时我会遇到(非排队)侦听器,这些侦听器依次调度(排队的)完成实际工作(链接或取消链接)的工作。