当前位置: 首页 > news >正文

源码网站怎么搭建建设网站 备案

源码网站怎么搭建,建设网站 备案,做网站属于It行业吗,怎么查找网站死链前言 在上一篇深入浅出#xff0c;SpringBoot整合Quartz实现定时任务与Redis健康检测#xff08;一#xff09;_往事如烟隔多年的博客-CSDN博客 文章中对SpringBoot整合Quartz做了初步的介绍以及提供了一个基本的使用例子#xff0c;因为实际各自的需求任务不尽相同因此并…前言 在上一篇深入浅出SpringBoot整合Quartz实现定时任务与Redis健康检测一_往事如烟隔多年的博客-CSDN博客 文章中对SpringBoot整合Quartz做了初步的介绍以及提供了一个基本的使用例子因为实际各自的需求任务不尽相同因此并未对定时任务的代码做相关填充。本文将对Redis的健康检测进行进一步的实现并且将尝试逐步缩减相关代码一步步优化定时任务的创建流程。 Redis定时检测 由于项目本身是一个学习类型项目因此实际的使用数据量并不会特别大。当然引入Redis是考虑到在对热点数据重复访问时提升响应速度关于缓存的实现方式多种多样此处就以Redis为例。 问题复现 在引入Redis之后某些接口在使用时需要从Redis中存取数据就需要保证Redis的存活状态否则会抛出异常。而如果在项目使用之初并没有配置Redis也将直接导致项目无法启动。此外在长时间不使用Redis时其连接池资源被释也会导致第一次访问时数据非常缓慢以上的情景在使用时是非常糟糕的。 解决方案 在一些实际的开发场景中遇到如上情况时可能会使用Hystrix来进行熔断或者采用限流等措施。然而对于我们来讲能够清楚的预见访问流量的有限性即使只使用单机的数据库也能支撑服务那么能否在Redis不可用时切换到MySQL查询呢答案是可以的。 这里使用Redis中的ping命令来实现对Redis存活状态的检测由于本项目中对于字符串类操作较多这里工具使用了StringRedisTemplate进行封装。RedisOperator即为其它类中操作Redis的工具类这里将其交由Spring容器管理。 Component public class RedisOperator {Autowiredprivate StringRedisTemplate redisTemplate;/*** 07.19 新增ping,用于redis健康检测,连接失败的异常将不会返回给前端,也不会进入全局异常处理* return*/public boolean ping(){boolean result;try{result PONG.equals(redisTemplate.getConnectionFactory().getConnection().ping());}catch (RedisConnectionFailureException e){log.error(捕获Redis连接异常,请检查服务运行状态!);result false;}return result;}// 其它命令...} 上述代码通过使用ping命令的返回值判断Redis当前的存活状态那么实际的使用场景如何呢以下是一个简单例子 可以看到如果不进行检测的话此时Redis处于未连接状态时将造成阻塞该方法会一直等待判断key是否存在解决状态的返回最终达到超时时间后将抛出异常体验非常糟糕。  if (redisOperator.keyIsExist(shopCategoryCacheKey.toString())) {// 获取数据返回shopCategoryVOList cacheOperator.readCache(shopCategoryCacheKey.toString(),new ArrayListShopCategoryVO());return new PageVO(shopCategoryVOList, shopCategoryVOList.size()); } 那么如何检测呢如上述代码不在少数也就是说每次执行时都要发送ping命令执行验证Redis存活状态而Redis只有在连接状态下才会及时返回除此之外均需等待到超时结束返回异常。这里就可以用到前一篇文章的定时任务了我们可以通过将ping命令执行交给定时任务进行检测然后维持一个boolean类型的标识每次判别标识即可。当Redis处于未连接状态时自然不会执行上述代码进而执行数据库查询操作。 定时任务 由于上一篇文章中已经编写了配置类 Configuration Slf4j public class RedisCheckConfig {// 指定生成的Bean实例对象名称Bean(redisCheck)public JobDetail jobDetail() {return JobBuilder.newJob(RedisCheckJob.class)// 任务名和任务分组.withIdentity(RedisCheckJob, group).withDescription(任务描述内存方式运行).storeDurably().build();}Bean(redisTrigger)public Trigger trigger() {return TriggerBuilder.newTrigger()// 触发器名称和分组.withIdentity(redisCheck, group).forJob(jobDetail()).startNow()// 使用SimpleSchedule构建定时任务.withSchedule(SimpleScheduleBuilder.simpleSchedule()// 每隔10s执行任务.withIntervalInSeconds(10)// 永不过期.repeatForever()).build();} } 因此这里只需要编写实际的业务类即可可以看到这里通过依赖注入获取到RedisOperator类它用于获取ping命令执行后的结果。 Slf4j public class RedisCheckJob extends QuartzJobBean {Autowiredprivate RedisOperator redisOperator;/*** Redis连接状态标识*/public static boolean redisConnected;Overrideprotected void executeInternal(JobExecutionContext context) throws JobExecutionException {log.info(开始检测Redis连接状态);redisConnected redisOperator.ping();log.info(Redis当前是否连接 redisConnected);} } 到这里就需要在进行Redis操作的代码前加入如下判断即可这样就实现了Redis的一样定期保活和健康检测一旦Redis处于未连接状态的将直接调用数据库查询而定时器执行检测的间隔将由使用者自行设置。 // 判断Redis存活状态 if(RedisCheckJob.redisConnected){// Redis操作 if (redisOperator.keyIsExist(shopCategoryCacheKey.toString())) {// ....} } 优化 虽然前文中已经对完成了文章开头所需要的解决的问题但每一次创建新的定时任务时均需要编写JobDetail和Trigger代码似乎有些冗余能否对其对进一步优化呢? 实际上对于普通的定时任务使用上述操作即可此处为个人学习探究内容酌情观看。 抽象类 VS 接口 考虑到需要构建JobDetail和Trigger均需要使用name和group属性因此考虑使用一个类进行管理在SpringBoot中使用Configuration和Bean注解可以将定时任务配置类关联到Scheduler中而若手动创建对象时则要考虑如何如何创建配置类获取配置类如何调用的问题 在上一篇文中提到可以通过继承 QuartzJobBean 类并重写其excuteInternal方法或实现 Job 接口的excute方法从QuartzJobBean的源码可知其实现了Job接口因此以上的创建方式任选其一即可。   这里就涉及到一个选择性的问题最终编写的实现类应该具有任务名、分组名称、触发器这三个属性它们将用于后续任务的构建。由于需要获取这三个属性因此考虑使用抽象方法获取因为最终的定时任务类为普通类只负责信息的初始化而目前来看若无需属性控制且均为抽象方法时则可以将该类转为接口这里无论选择抽象类还是接口都需要确保最终实现了Job接口。 这里以接口为例构建scheduleBuilder()方法用于接收实现类的定时器通过实现该方法将由子类中自行决定使用哪种定时器。 public interface IntervalJobInterface extends Job {/*** 任务名称* return*/String jobName();/*** 任务分组* return*/String jobGroup();/*** 不同的任务定时器,由实现类构建* return*/ScheduleBuilder scheduleBuilder(); } 编写定时任务类如下 Slf4j Component public class RedisCheckConfigForInterface implements IntervalJobInterface {Autowiredprivate RedisOperator redisOperator;/*** 任务名称*/public String name redis-check;/*** 分组名称*/public String group redis;/*** 任务执行周期,单位s*/public Integer intervalTime 60;/*** redis连接状态*/public static boolean redisConnected;Overridepublic String jobName() {return name;}Overridepublic String jobGroup() {return group;}/*** 不同定时器** return*/Overridepublic ScheduleBuilder scheduleBuilder() {return SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(intervalTime)// 永不过期.repeatForever();}/*** 定时任务逻辑**/Overridepublic void execute(JobExecutionContext context) throws JobExecutionException {log.info(开始检测Redis连接状态,IntervalInterface);redisConnected redisOperator.ping();log.info(Redis当前是否连接 redisConnected);} } 之后可以通过Component或Confiugration注解将其放入Spring的容器中方便取用。  Component VS Confiugration 如下为获取配置类信息的代码其作用为获取 IntervalJobInterface 接口的所有实现类然后通过实例获取其任务名和分组名上一步中提到实现类的编写可以使用Component或Confiugration注解那两者有什么区别呢一般来说Configuration注解与Bean注解作用于配置类上但目前代码中没有使用Bean注解生成Bean实例那么是否可以在任务类上直接使用Configuration注解呢 这里需要特别注意若需要在其它地方通过反射机制获取如上任务类的属性时Configuration标注的类将使用cglib生成代理类反射获取不能直接取得类信息获得属性需要通过getClass().getSuperClass()的方式获取。而Component注解作用的类生成的原有的类实例可以直接getClass()获取类信息再获取属性。 既然可以直接反射获取其相关属性为什么还需要添加一个接口由于反射获取的属性需要创建新对象重新组装JobDetail和Trigger都需要一个实例类信息添加一个接口可以获取信息的同时也能用作实例类的描述详见如下代码 Component Slf4j public class QuartzConfig {Autowiredprivate ApplicationContext applicationContext;Autowiredprivate Scheduler scheduler;/*** Constructor(构造方法) - Autowired(依赖注入) - PostConstruct(注释的方法)* 获取所有实现了任务标记接口类,*/PostConstructpublic void getInitBeans() {log.info(开始获取定时任务);MapString, IntervalJobInterface intervalJobInterfaceMap applicationContext.getBeansOfType(IntervalJobInterface.class);intervalJobInterfaceMap.forEach((className, jobInstance) - {IntervalJobInterface intervalJobs (IntervalJobInterface) jobInstance;log.info(任务名称: intervalJobs.jobName());log.info(任务分组: intervalJobs.jobGroup());// 定时任务不存在,无法执行if (intervalJobs.scheduleBuilder() null) {log.error(className 任务无法运行, 请指定任务的运行周期时间后再试!);return;}JobDetail jobDetail jobDetail(intervalJobs);Trigger trigger trigger(jobDetail, intervalJobs);try {scheduler.scheduleJob(jobDetail, trigger);// crontab 表达式的任务不会立即执行,如需立即执行则取消如下条件判断代码的注释//if (intervalJobs.scheduleBuilder() instanceof CronScheduleBuilder) {// scheduler.triggerJob(jobDetail.getKey());//}log.info(已添加 intervalJobs.jobName() 任务 jobKey jobDetail.getKey());} catch (SchedulerException e) {log.error(定时任务出现异常);e.printStackTrace();}});log.info(获取定时任务结束);}/*** 任务详情** param intervalJobs* return*/public JobDetail jobDetail(IntervalJobInterface intervalJobs) {return JobBuilder.newJob(intervalJobs.getClass()).withIdentity(intervalJobs.jobName(), intervalJobs.jobGroup()).withDescription(内存运行).storeDurably().build();}/*** 触发器** return*/public Trigger trigger(JobDetail jobDetail, IntervalJobInterface intervalJobs) {return TriggerBuilder.newTrigger().withIdentity(intervalJobs.jobName(), intervalJobs.jobGroup()).forJob(jobDetail).startNow().withSchedule(intervalJobs.scheduleBuilder()).build();}} 此处的类使用了Component注解由于我们这个类中无需要获取的属性这里使用Configuration同样可以甚至getInitBeans()也可以用Bean注解。此处使用PostConstruct注解是为了保证在容器加载完后会执行该方法以完成定时任务的获取和后续执行。 立即执行 一般来讲由CronScheduleBuilder构建的定时任务并不会启动后就立即执行(Trigger中添加了startNow()但仅对SimpleScheduleBuilder生效)因此可以通过如下代码使其生效 // crontab 表达式的任务不会立即执行,如需立即执行则取消如下条件判断代码的注释 if (intervalJobs.scheduleBuilder() instanceof CronScheduleBuilder) {scheduler.triggerJob(jobDetail.getKey()); } 可以看到由CronScheduleBuilder构建的任务在SpringBoot启动后立即执行。
http://www.w-s-a.com/news/910654/

相关文章:

  • 网站建设的意义与目的建立什么船籍港
  • 广州注册公司营业执照网站建设代码优化
  • 百度网站官网马克互联网主题 wordpress
  • 网站制作 客户刁难深圳自助建站
  • 怎么去推广一个网站广东餐饮品牌设计
  • 网站代码加密了怎么做兰州最新大事
  • 现在ui做的比较好的网站去年做啥网站致富
  • 广东网站建设咨询电话好牌子网
  • 公司怎样制作网站南阳网站关键词
  • 营销型网站建设与网盟完整php网站开发
  • 网站做微信链接怎么做的石桥铺网站建设公司
  • 济南mip网站建设公司做图书馆网站模板
  • app 门户网站网站项目框架
  • 做网站视频网站备案 新闻审批号
  • 织梦网站怎么居中视频网站开发与制作
  • 网站上海备案佛山网站seo哪家好
  • 品牌形象网站有哪些珠海市区工商年报在哪个网站做
  • 注册域名不建设网站seo外包服务方案
  • 如何进行外贸网站建设wordpress文章输入密码可见
  • 政务网站建设索引常州做网站信息
  • 南宁做网站找哪家好wordpress 更改首页
  • 一个人在家做网站建设品牌策划流程
  • 小网站广告投放wordpress页面添加js
  • 仿制别人的竞价网站做竞价犯法吗wordpress添加版块
  • wordpress主题 站长互联网站备案表
  • 广州品牌策划公司排行南宁seo网络推广公司
  • 营销型网站图片肯德基网站开发
  • 网站的外链是什么wordpress开启菜单
  • 文字字体是什么网站西安博达网站建设
  • 北京南昌网站建设网站查看空间商