laravel8 模型监听之观察者监听事件 附带消息队列实现

思考 什么是模型监听? 为什么要使用模型监听

就相当于在执行模型操作的时候安装的一个小监控和一个小保安 当我们的监控到的时候让保安去执行一些操作 模型监听的出现是我们的代码变得高度解耦 还可以配合消息队列 可以解决在服务器高峰的时候暂缓一些任务 等高峰过去以后 帮我们执行一些操作 这里有个很好的例子就是我们的苹果手机支付 apple pay 他就是一个典型的例子 你在网上消费的钱他会晚一会进行扣款的操作

观察者监听模型事件

第一步 创建一个观察者

doc 命令创建一个观察者:

php artisan make:observer NoticeObserver -m Notice

默认生成的Noticeserver 会给你生成 created updated deleted restored(恢复) forceDeleted(强制删除)的空方法 根据他们的方法名你就不难看出他是什么时候执行监听的 如下图:

 注:批量更新时不会触发相应事件,因为是直接走查询构建器完成的,绕过了模型方法。

第二步:在我们的观察者类中写一个任务比如写日记

 第三步:如果我们想要他在那个模型中执行 我们需要在这个模型中注册一下

 因为他是继承的boot类  子类和父类重名的时候我们声明父类不然会被替换

例如我们刚才的任务是写在了created方法中 就说明这个任务是在添加完成以后执行

 

使用监听完成消息队列

消息队列流程图表

根据上图,首先创建消息管道,来存储任务  本次使用mysql表来当消息管道

创建容器数据表

php artisan queue:table   任务队列表
php artisan queue:failed-table  执行任务失败后,存储的表
php artisan migrate  执行迁移

注:在这里迁移的时候我们有时候报错原因是 我们配置文件database.php中的数据库格式是utf8mb4 我们修改为utf8 就可以执行迁移了 这里就是laravel的原因你直接更改数据库的字符集不管用

 

 创建任务

php artisan make:job xxx

创建完成的文件

 在我们刚才的观察者中添加一下这个任务

 当我们执行完成添加操作以后我们就可以在我们的表中看到我们待执行的任务了

 

 可是我们做完这一系列操作以后你会发现你并没有执行任务 这是因为我们没有人去消费他参考上图 他现在就相当于消息队列 一个一个待执行的任务在管道中排好队等你去执行 上面这个表就是你管道中现在的内容

消费管道中的任务

php artisan queue:work

当这串doc命令执行以后你会看到

 

这里就是已经开始消费了 完成以后你管道中的数据就会消失

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Spring自己维护事件队列。这意味着Spring框架有自己的事件处理机制,可以帮助开发人员管理事件队列,从而更方便地处理事件。例如,通过Spring可以方便地注册和触发事件,以及管理事件监听器。这种机制有助于提高代码的可维护性和可扩展性。 ### 回答2: 在Spring框架中,可以通过使用Spring的事件机制来实现自己维护事件队列。Spring的事件机制是基于观察者设计模式实现的,通过定义和使用事件监听器以及发布者来实现事件的传递和响应。 首先,我们可以定义自己的事件类,该事件类可以包含一些需要传递的信息。然后,我们可以定义监听器类,该监听器类实现了Spring的ApplicationListener接口,并且重写了onApplicationEvent方法,用于处理收到的事件。接下来,我们可以通过在需要发布事件的地方,使用Spring的ApplicationContext对象的publishEvent方法来发布事件,该方法会遍历所有注册的监听器,并逐一调用其onApplicationEvent方法。 在这个过程中,Spring会维护一个事件队列,用于存储待发布的事件。当调用publishEvent方法时,Spring会将事件放入事件队列中,然后按照先进先出的原则依次发布事件。通过这种方式,可以确保事件的顺序性和可靠性。 自己维护事件队列的好处是可以更加灵活地控制事件的流程和顺序,可以自定义事件队列的大小和处理策略。例如,可以设置队列的最大容量,当队列满时可以选择等待或者丢弃新的事件。同时,可以基于事件队列实现异步事件处理,将事件放入队列后立即返回,然后在后台线程中异步处理事件,提高系统的响应速度和并发处理能力。 总之,通过Spring自己维护事件队列,我们可以更好地管理和处理事件实现灵活的事件驱动的应用程序。 ### 回答3: Spring框架在自己的核心模块中提供了一个事件机制,允许开发者使用应用程序内的事件来解耦不同的组件或模块。在Spring中,事件的产生者可以通过将事件发布到ApplicationContext中的事件队列来通知其他组件。这个事件队列由Spring框架自己维护。 当一个事件发布到事件队列时,Spring框架将会负责事件的分发和通知工作。它会查找所有已注册的事件监听器,并将事件传递给这些监听器进行处理。监听器可以实现ApplicationListener接口,并定义自己感兴趣的事件类型。当事件类型与监听器定义的类型匹配时,监听器将被触发执行相应的逻辑。 通过自己维护事件队列,Spring框架能够实现松耦合的组件之间的通信。不同的组件可以独立地触发和监听事件,从而实现解耦。这种事件驱动的架构可以提高代码的可维护性和可扩展性,同时也方便实现一些跨模块、跨层的功能,如异步处理、事务管理等。 Spring还提供了一些其他的特性来增强事件机制的灵活性,例如事件的优先级定义、事件的同步或异步处理等。开发者可以根据具体的需求来配置事件的处理方式。 综上所述,Spring框架通过自己维护事件队列实现了一个简单但强大的事件机制,用于在应用程序内部实现组件之间的松耦合通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

啥都不多头发多

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值