quartz框架和spring定时任务,spring boot quartz动态定时任务
目录
quartz下载安装实用案例常见问题及解决方案
quartz下载、安装
Quartz是一个完全由java开发的开源任务进度管理系统。任务调度管理器(Task schedule manager)是一个负责在预定时间到来时执行(或通知)一段程序或功能的系统,即在固定时间执行某个任务。Quartz使用一个小的Java库来发布文件(。jar文件),其中包含所有Quartz核心函数。这些功能的主接口(API)是调度程序接口。它提供简单的操作,例如:从计划中添加或取消任务,以及启动/停止/暂停计划进度。
上图展示了quartz服务涉及的11个表,下图展示了maven中引入的quartz依赖包。
Quartz的jar包下载、SpringBoot项目集成、Quartz安装和具体使用方法在本站已经有了,但建议参考W3CSchool的官方文档《Quartz快速入门指南》。
官方地址:https://www.w3cschool.cn/quartz_doc/quartz_doc-2put2clm.html
00-1010如果我的开发环境已经配置好了,我们就只关注具体的业务实现。事实上,在做一个项目的过程中,很少允许开发人员自己集成组件。通常,开发环境已经配置好了。如果需要配置,请参考官方文档。现在有个要求,每天凌晨筛选一个报名表A的信息,刷到表B里,先粘贴代码:
//RefreshTableJob . Java @ component的代码( refreshtablejob )公共类refreshtablejob { private static final logger logger=loger factory . get logger(refreshidlesetjob . class);public void pull data(){ try { spring utils . get bean(iassetservice . class)。initidle asset list();} catch(restclientresponseException e){ logger . error(数据同步失败,error : e . getmessage());} catch(Exception e){ e . printstacktrace();Logger.error(数据同步失败,error : e . getmessage());} } } }/assetserviceimpl.java的代码实现iastservice接口@ servicepublic类idlesetserviceimplements IassetService { @ resource private idlesetmapper idlesetmapper;/* * * Pull增量闲置资产数据*/@ override @ transactional public void initdlesetlist(){//进程闲置数据listhashmap initlist=idlesetmapper . selectidlelist(null);while (initList!=null init list . size()0){ for(HashMap data : initList){ HashMap param map=new HashMap();String uuid=UUID.randomUUID()。toString()。trim();paramMap.put(UPDATETIME ,date utils . getnowdate());paramMap.put(UPDATEUSER , );paramMap.put(STATUS ,data . get( A _ STATUS ));//。这里省略了很多字段parammap.put (usage secret ,data . get( a _ usage secret );paramMap.put(BELONGENTITYID ,data . get( A _ ID );我
dleAssetMapper.saveIdleAsset(paramMap); } initList = idleAssetMapper.selectEquipIdleList(null); } logger.info("设备仪器表闲置资产数据获取完成");RefreshTableJob.java就是定时任务执行的入口,它的主要逻辑是调用service实现类中的initIdleAssetList方法,调用Mybatis的mapper文件查询数据库表A的增量数据,循环处理后刷入B表,配置的cron表达式是 0 0 2 1/1 * ? * (每天两天执行一次)。
常见问题及解决方案
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.bjsasc.openshare.idleasset.service.IassetService' available
原因:定时任务类RefreshTableJob中找不到IassetService这个类解决方法:在系统的启动类的main方法中加上这么一行配置信息,仅本地调试的时候加哦,这行代码不用提交,生产环境没有这个问题,不知道为啥子System.setProperty(spring.devtools.restart.enabled, false);
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
直接原因:我在插入B表的时候看到有个创建人字段,想获取系统中的当前登录用户信息,结果获取不到request相关对象
相信查过资料的朋友看到了网上说的设置request子线程共享或者重新实现RequestAttributes接口的方式了,这俩方案只是屏蔽报错的,如果只是想屏蔽报错,那直接删掉出错位置的代码或者写个自定义接口实现类判断一下requestAttributes 为空时new一个就完了。
那怎么获取当前登录用户呢?答案是获取不到,定时任务可以在不登陆系统的情况下运行,对于在controller层调用service方法(WEB访问方式)中使用RequestContextHolder或者WebApplicationContext对象获取上下文的情况完全没有问题。但是除了controller层外,调度任务等也可能调用service层的方法(非web方式根本不存在request对象),这种情况下不能使用上下文对象获取其中的用户信息。如果你非要娶,可以提前把用户登录信息存到redis或者其他渠道,看起来有点麻烦,真有这样的需求吗,showme探讨一下。
到此这篇关于springBoot项目集成quartz开发定时任务案例及注意事项的文章就介绍到这了,更多相关springBoot集成quartz开发定时任务内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。