当前位置:首页 > 数码 > 监听器的深入原理与实践应用-Spring

监听器的深入原理与实践应用-Spring

admin4个月前 (05-09)数码21

引言

Spring 框架是一个强大且流行的开发框架,它提供许多功能和特性来简化开发过程。其中一个重要的特性就是监听器(Listener)机制。对于 Spring 的监听器,许多人有所了解,甚至知道它采用了观察者模式,但实际上,Spring 的监听器还应用了适配器模式和工厂模式等设计模式。本文将深入探讨 Spring 监听器的原理和机制,帮助大家更好地理解和应用这一功能。

Spring 监听器基本概念

在 Spring 中,监听器是一种用于捕获和处理事件的机制。它可以监测到应用程序中发生的特定事件,并在事件发生时执行相应的操作。这些事件可以是 Spring 框架内部的事件,也可以是自定义的事件。通过使用监听器,我们可以实现应用程序的解耦和模块化,提高代码的可维护性和可扩展性。

Spring 监听器与观察者模式

Spring 的监听器机制采用了观察者模式。在观察者模式中,有两个主要的角色:观察者(Observer)和被观察者(Subject)。在 Spring 中,被观察者就是事件源,而观察者则是监听器。当事件源发生特定事件时,它会通知所有注册的监听器,并调用相应的方法进行处理。这种松耦合的设计模式使得我们可以方便地添加或移除监听器,以适应不同的业务需求。

Spring 监听器与适配器模式

除了观察者模式,Spring 的监听器还应用了适配器模式。适配器模式可以将一个类的接口转换成客户端所期望的另一个接口。在 Spring 监听器中,适配器模式的作用是将不同类型的事件适配到相应的监听器上。这样,我们可以使用同一个监听器处理多种类型的事件,提高代码的复用性和灵活性。

Spring 监听器与工厂模式

Spring 的监听器还涉及到工厂模式的应用。工厂模式是一种创建型设计模式,它提供了一种统一的方式来创建对象,而无需暴露对象的具体实现。在 Spring 监听器中,工厂模式的作用是通过工厂类来创建监听器实例。这样,我们可以通过配置文件或注解的方式来动态地创建和管理监听器,而不需要直接依赖于具体的实现类。

总结

Spring 的监听器机制是一种强大而灵活的事件处理机制,它采用了观察者模式、适配器模式和工厂模式等设计模式。通过使用监听器,我们可以实现应用程序的解耦和模块化,提高代码的可维护性和可扩展性。同时,监听器还能够提供更好的代码复用和灵活性。因此,深入了解和应用 Spring 监听器是每个开发人员都应该掌握的技能。

学习和使用 Spring 监听器

在学习和使用 Spring 监听器时,我们可以通过以下步骤来进行:

  1. 理解观察者模式的基本概念和原理,了解事件源和监听器的关系。
  2. 学习 Spring 框架中的监听器接口和相关的类,如licationListener和ApplicationContext。
  3. 掌握如何创建和注册监听器,可以通过配置文件或注解的方式来实现。
  4. 熟悉监听器的生命周期和执行顺序,了解监听器的执行过程和机制。
  5. 实践应用,通过编写示例代码来展示和验证监听器的功能和效果。

通过以上步骤的学习和实践,我们可以更好地掌握和应用 Spring 监听器,为我们的应用程序增加更多的灵活性和可扩展性。同时,深入理解 Spring 监听器的设计原理和机制也有助于我们在日常开发中更好地解决问题和优化代码。

结语

Spring 监听器是 Spring 框架中一个重要且强大的功能,它采用了观察者模式、适配器模式和工厂模式等设计模式。通过学习和应用 Spring 监听器,我们可以实现应用程序的解耦和模块化,提高代码的可维护性和可扩展性。希望本文对大家深入学习和理解Spring 监听器有所帮助,也希望大家能够在实际项目中充分发挥这一功能的优势。


springboot starter 原理解析及实践

starter是springBoot的一个重要部分。通过starter,我们能够快速的引入一个功能,而无需额外的配置。同时starter一般还会给我提供预留的自定配置选项,我们只需要在中设置相关参数,就可以实现配置的个性化。

那么这些方便的操作是怎么实现的呢?通过了解其原理,我们也可以做一个自己的starter,来让别人快速使用我们的功能。

按个人理解,我认为springBoot Starter就是一个 智能化的配置类 @Configuration 。

接下来介绍内容包括:

1、【创建module】,首先我们自定义一个starter的module,根据你的starter实现复杂度,引入相关spring组件。最基本的,我们只需引入 spring-boot-autoconfigure 模块。

2、【业务bean实现】实现我们的业务bean,案例中我们实现最简单的sayHello服务,输入msg,返回“hello,{msg}”。

3、然后就是Configuration类的创建,这个类是starter自动初始化的核心类,负责把业务相关的bean智能的加载进来。

4、配置 ,通过该配置,才能让springboot来自动加载我们的Configuration类。具体原理我们稍后深入了解。

Spring监听器

具体的,是在模块的 resources/META-INF目录下,新建 文件。内容如下:

最后我们把上述模块单独执行以下install或者deploy,一个starter就做好了。

其他项目使用我们的starter就非常简单了:(1)引入starter依赖;(2)注入需要的service。

回头再看上边的开发流程,有两个地方需要我们了解一下:

(1)如何让starter被自动识别加载里的EnableAutoConfiguration原理。

(2)如何实现自动加载的智能化、可配置化:@Configuration配置类里注解。

这里我们只简单的说一下大致的原理和流程,执行细节大家可以按照文章给出的思路自己去研读。

在SpringBoot的启动类,我们都会加上 @SpringBootApplication 注解。这个注解默认会引入 @EnableAutoConfiguration 注解。然后 @EnableAutoConfiguration 会 @Import() 。

的selectImports方法最终会通过 ,加载 META-INF/ 里的 EnableAutoConfiguration 配置值,也就是我们上文中设置的资源文件。

实际使用中,我们并不总是希望使用默认配置。比如有时候我想自己配置相关功能,有时候我想更改一下默认的服务参数。这些常见的场景Starter都想到了,并提供了如下的解决方案:

springboot starter提供了一系列的 @Conditional* 注解,代表什么时候启用对应的配置,具体的可以去查看一下springboot的官方文档。

比如我们案例中的 「@ConditionalOnClass()」,代表如果存在DemoHelloService类时,配置类才会生效;又比如「@ConditionalOnMissingBean()」,代表着如果项目中没有DemoHelloService类型的bean,那么该配置类会自动创建出starter默认的DemoHelloService类型bean。

这个注解主要是为了解决如下场景:我想要使用starter的默认配置类,但是又想对配置中的某些参数进行自定义配置。 @ConfigurationProperties 类就是做这个工作的。例如上述例子中,我想对默认的defaultMsg做些个性化的设置。就可以按如下方式来实现:

starter新增ConfigurationProperties类bean

启用property

在实际项目中自定义默认msg

分布式定时任务调度框架实践

分布式任务调度框架几乎是每个大型应用必备的工具,本文介绍了任务调度框架使用的需求背景和痛点,对业界普遍使用的开源分布式任务调度框架的使用进行了探究实践,并分析了这几种框架的优劣势和对自身业务的思考。

一、业务背景

1.1 为什么需要使用定时任务调度

(1)时间驱动处理场景: 整点发送优惠券,每天更新收益,每天刷新标签数据和人群数据。

(2)批量处理数据: 按月批量统计报表数据,批量更新短信状态,实时性要求不高。

(3)异步执行解耦: 活动状态刷新,异步执行离线查询,与内部逻辑解耦。

1.2 使用需求和痛点

(1)任务执行监控告警能力。

(2)任务可灵活动态配置,无需重启。

(3)业务透明,低耦合,配置精简,开发方便。

(4)易测试。

(5)高可用,无单点故障。

(6)任务不可重复执行,防止逻辑异常。

(7)大任务的分发并行处理能力。

二、开源框架实践与 探索

2.1 Java 原生 Timer 和

ScheduledExecutorService

2.1.1 Timer使用

Timer缺陷:

由于上述缺陷,尽量不要使用Timer, idea中也会明确提示,使用ScheduledThreadPoolExecutor替代Timer 。

2.1.2 ScheduledExecutorService使用

ScheduledExecutorService对于Timer的缺陷进行了修补,首先ScheduledExecutorService内部实现是ScheduledThreadPool线程池,可以支持多个任务并发执行。

对于某一个线程执行的任务出现异常,也会处理,不会影响其他线程任务的执行,另外ScheduledExecutorService是基于时间间隔的延迟,执行不会由于系统时间的改变发生变化。

当然,ScheduledExecutorService也有自己的局限性:只能根据任务的延迟来进行调度,无法满足基于绝对时间和日历调度的需求。

2.2 Spring Task

2.2.1 Spring Task 使用

spring task 是spring自主开发的轻量级定时任务框架,不需要依赖其他额外的包,配置较为简单。

此处使用注解配置

2.2.2 Spring Task缺陷

Spring Task 本身不支持持久化,也没有推出官方的分布式集群模式,只能靠开发者在业务应用中自己手动扩展实现,无法满足可视化,易配置的需求。

2.3 永远经典的 Quartz

2.3.1 基本介绍

Quartz框架是Java领域最著名的开源任务调度工具,也是目前事实上的定时任务标准,几乎全部的开源定时任务框架都是基于Quartz核心调度构建而成。

2.3.2 原理解析

核心组件和架构

关键概念

(1) Scheduler :任务调度器,是执行任务调度的控制器。本质上是一个计划调度容器,注册了全部Trigger和对应的JobDetail, 使用线程池作为任务运行的基础组件,提高任务执行效率。

(2) Trigger :触发器,用于定义任务调度的时间规则,告诉任务调度器什么时候触发任务,其中CronTrigger是基于cron表达式构建的功能强大的触发器。

(3) Calendar :日历特定时间点的集合。一个trigger可以包含多个Calendar,可用于排除或包含某些时间点。

(4) JobDetail :是一个可执行的工作,用来描述Job实现类及其它相关的静态信息,如Job的名称、监听器等相关信息。

(5) Job :任务执行接口,只有一个execute方法,用于执行真正的业务逻辑。

(6) JobStore :任务存储方式,主要有RAMJobStore和JDBCJobStore,RAMJobStore是存储在JVM的内存中,有丢失和数量受限的风险,JDBCJobStore是将任务信息持久化到数据库中,支持集群。

2.3.3 实践说明

(1)关于Quartz的基本使用

(2)业务使用要满足动态修改和重启不丢失, 一般需要使用数据库进行保存。

(3)组件化

(4)扩展

2.3.4 缺陷和不足

(1)需要把任务信息持久化到业务数据表,和业务有耦合。

(2)调度逻辑和执行逻辑并存于同一个项目中,在机器性能固定的情况下,业务和调度之间不可避免地会相互影响。

(3)quartz集群模式下,是通过数据库独占锁来唯一获取任务,任务执行并没有实现完善的负载均衡机制。

2.4 轻量级神器 XXL-JOB

2.4.1 基本介绍

XXL-JOB是一个轻量级分布式任务调度平台,主打特点是平台化,易部署,开发迅速、学习简单、轻量级、易扩展,代码仍在持续更新中。

主要提供了任务的动态配置管理、任务监控和统计报表以及调度日志几大功能模块,支持多种运行模式和路由策略,可基于对应执行器机器集群数量进行简单分片数据处理。

2.4.2 原理解析

2.1.0版本前核心调度模块都是基于quartz框架,2.1.0版本开始自研调度组件,移除quartz依赖 ,使用时间轮调度。

2.4.3 实践说明

详细配置和介绍参考官方文档。

2.4.3.1 demo使用:

@JobHandler(value=offlineTaskJobHandler) ,实现业务逻辑即可。(注:此次引入了dubbo,后文介绍)。

(滑动可查看)

示例2:分片广播任务。

(滑动可查看)

2.4.3.2 整合dubbo

(1)引入dubbo-spring-boot-starter和业务facade jar包依赖。

(滑动可查看)

(2)配置文件加入dubbo消费端配置(可根据环境定义多个配置文件,通过profile切换)。

(滑动可查看)

(3)代码中通过@Reference注入facade接口即可。

(滑动可查看)

(4)启动程序加入@EnableDubboConfiguration注解。

(滑动可查看)

2.4.4 任务可视化配置

内置了平台项目,方便了开发者对任务的管理和执行日志的监控,并提供了一些便于测试的功能。

2.4.5 扩展

(1)任务监控和报表的优化。

(2)任务报警方式的扩展,比如加入告警中心,提供内部消息,短信告警。

(3)对实际业务内部执行出现异常情况下的不同监控告警和重试策略。

2.5 高可用 Elastic-Job

2.5.1 基本介绍

Elastic-Job是一个分布式调度解决方案,由两个相互独立的子项目Elastic-Job-Lite和Elastic-Job-Cloud组成。

Elastic-Job-Lite定位为轻量级无中心化解决方案,使用jar包的形式提供分布式任务的协调服务。

Elastic-Job-Cloud使用Mesos + Docker的解决方案,额外提供资源治理、应用分发以及进程隔离等服务。

可惜的是已经两年没有迭代更新记录。

2.5.2 原理解析

2.5.3 实践说明

2.5.3.1 demo使用

(1)安装zookeeper,配置注册中心config,配置文件加入注册中心zk的配置。

(滑动可查看)

(滑动可查看)

(2)配置数据源config,并配置文件中加入数据源配置。

(滑动可查看)

(滑动可查看)

(3)配置事件config。

(滑动可查看)

(4)为了便于灵活配置不同的任务触发事件,加入ElasticSimpleJob注解。

(滑动可查看)

(5)对配置进行初始化。

(滑动可查看)

(6)实现 SimpleJob接口,按上文中方法整合dubbo, 完成业务逻辑。

(滑动可查看)

2.6 其余开源框架

(1) Saturn :Saturn是唯品会开源的一个分布式任务调度平台,在Elastic Job的基础上进行了改造。

(2) SIA-TASK :是宜信开源的分布式任务调度平台。

三、优劣势对比和业务场景适配思考

业务思考:

四、结语

对于并发场景不是特别高的系统来说,xxl-job配置部署简单易用,不需要引入多余的组件,同时提供了可视化的控制台,使用起来非常友好,是一个比较好的选择。希望直接利用开源分布式框架能力的系统,建议根据自身的情况来进行合适的选型。

附:参考文献

高可用架构

改变互联网的构建方式

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: Spring监听器