service注入为null_如何解决quartz调度时候,job中的service为null的问题?

7fc9e533151fdfa4bddcab7f09ff358b.png

在需要用到调度任务的时候,发现job中的通过依赖注入的service对象为null.如下:

@Component
public class ExpiredOrderJob implements Job {@Autowiredprivate EmployeeService employeeService; //这里的service对象为null@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {……}
}

问题的原因:

出现这个问题的根本原因,还得从spring的IOC和AOP的基本原理开始讲起。

在IOC中,是spring先把需要放置到IOC容器的对象放入,然后在通过IOC机制去请求获得该对象的时候,然后调用出来IOC容器中准备好的对象。具体在springboot中的表现,如果你在一个类中增加了Component的注解,或者在一个Configure中增加了Bean的注解,IOC就会明白你想要把该对象放入到容器,然后在需要容器帮你实例化的地方加入Autoware,容器就会把该对象给注入。需要注意的地方是,容器只能对容器注入的对象内部的属性注入,如果你通过自己的代码new了一个对象,这对象里面的Autoware的属性是不起作用的。很好理解,因为你的对象不在容器的管理范围,容器就无法去注入。

而在quartz的job对象,是通过直接传入job类的class,由quartz框架去实例化的,而非通过spring框架去实例化的,自然就无法完成注解。

 JobDetail jobDetail = JobBuilder.newJob(ExpiredOrderJob.class) //把job.class传入了jobBuilder.withIdentity("expireOrder","group1").build();

解决的思路:

在job中通过Autoware注解去实现,是不太可能了。而JobDetail 可以通过jobDataMap的属性来传递对象,我们可以在需要spring注入的地方,把我们要注入的对象放到jobDataMap中去,然后在job中取出来使用,来绕道完成注解。

版本1:

//在调用调度器的地方去实现注入
@Autowired
private EmployeeService employeeService;
private void scheduleSumJob(Scheduler scheduler) throws SchedulerException{JobDetail jobDetail = JobBuilder.newJob(SumJob.class).withIdentity("sumJob","group1").build();jobDetail.getJobDataMap().put("service",employeeService);CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}
//在job中去实现调用
public class SumJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{EmployeeService employeeService = (EmployeeService)jobExecutionContext.getJobDetail().getJobDataMap().get("service");employeeService.freshAreaEmployeeNum();}
}

经过测试,我们已经能解决了在job中无法注入的问题。但是也有一些缺点,比如我们要再数据库中保存很多的任务,而每个任务所调用service都不一样。我们就无法在我们的使用调度器的地方去实现找到需要注入的对象,然后放到jobDataMap中去。我们得一个更加通用的办法:比如我们把spring的容器的context注入,然后job中需要什么注入对象,就直接从context中去获得 ,这样就实现了通用性:

版本2:

@Autowired
private ServletContext servletContext;
private void scheduleSumJob(Scheduler scheduler) throws SchedulerException{JobDetail jobDetail = JobBuilder.newJob(SumJob.class).withIdentity("sumJob","group1").build();jobDetail.getJobDataMap().put("context",servletContext);CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/2 * * * * ?");CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("trigger1","group1").withSchedule(scheduleBuilder).build();scheduler.scheduleJob(jobDetail,cronTrigger);}

job中对应的变化

public class SumJob implements Job {@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException{ServletContext context = (ServletContext)jobExecutionContext.getJobDetail().getJobDataMap().get("context");WebApplicationContext cxt = (WebApplicationContext) context.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);EmployeeService employeeService = cxt.getBean(EmployeeService.class);employeeService.freshAreaEmployeeNum();}
}

这样做的好处就是把service的注入的获得延迟了,可以在job中更加灵活的调用所需要的对象,而无需在启用调度器的地方去思考,更加通用,降低了耦合。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作7年,我的10条经验总结

简介: 作者是一名很普通的技术工程师,从14年毕业到现在工作了7年。本文将与大家分享一些在职场中的道理和经验,希望能对大家有所启发和帮助。 作者 | 抱真 来源 | 阿里技术公众号 前言 简单做个自我介绍,我是一名很普通的技术工…

从能用到好用,GIS信创如何做到行稳致远?

艾瑞咨询集团出品的《2021年中国信创产业研究报告》中提到,信创内涵体现在“从‘关键环节、部分市场’走向‘全产业链、全行业’的信息技术升级,构建中国自主的IT标准和生态”。本文将从GIS信创的3大关键技术战略出发,解析当下如何快速突破发…

CPU静默数据错误:存储系统数据不丢不错的设计思考

简介: 对于数据存储系统来说,保障数据不丢不错是底线,也是数据存储系统最难的部分。据统计,丢失数据中心10天的企业,93%会在1年内破产。那么如果想要做到数据不丢不错,我们可以采取怎样的措施呢&#xff1f…

分计算iv值_筛选变量的指标—IV值

这一期咱们聊聊筛选变量的指标——IV值。计算公式如下:看公式有没有很熟悉,大家没有看错,其中一部分就是WOE的计算公式。区别就在于WOE是对一个变量的每个分组的计算,IV值是对一个变量的统计指标。如上图所示,当前使用…

无需 Dockerfile 的镜像构建:BuildPack vs Dockerfile

作者 | Addo Zhang来源 | 云原生指北过去的工作中,我们使用微服务、容器化以及服务编排构建了技术平台。为了提升开发团队的研发效率,我们同时还提供了 CICD 平台,用来将代码快速的部署到 Openshift(企业级的 Kubernetes&#xff…

android studio json插件_热门Android Studio 插件,这里是Top 20

Android Studio是Google基于IntelliJ开发的一款功能强大的开发工具,它具有构建出色Android应用所需要的一切。借助基于IntelliJ IDEA的强大的功能,插件非常丰富。正确的使用插件可以帮助你提高工作效率,更智能,更快。但是&#xf…

云原生时代,企业多活容灾体系构建思路与最佳实践

简介: 对于云原生的概念解读,大家经常会听到微服务、容器这些,那么这些技术跟企业容灾到底有什么样的关系?其实容灾的需求各行各业都有,比如金融行业对于容灾也有强烈的需求。但是怎么把容灾和多活能力构建起来&#x…

MaxCompute 挑战使用SQL进行序列数据处理

简介: MaxCompute 挑战使用SQL进行序列数据处理 --而不是用MR和函数 日常编写数据加工任务,主要的方法就是使用SQL。第一是因为自己对SQL掌握的比较好(十多年数据开发经验,就这几个关键字,也不敢跟别人说自己不行&…

低代码发展专访系列之四:低代码平台会带动企业的组织变革吗?

前言:2019年开始,低代码爆火。有人认为它是第四代编程语言,有人认为它是开发模式的颠覆,也有人认为是企业管理模式的变革……有很多声音,社区讨论很热烈。CSDN随后展开低代码平台产品系列活动,包括低代码开…

esclip直接快捷键构造函数_史上最全IntelliJ IDEA mac版快捷键文档

IntelliJ IDEA 是一款功能强大的Java IDE编辑器,支持java体系的web、客户端、安卓等开发。做为一款优秀的IDE,想要提高效率,最好是记住常用的快捷键,能让你事半功倍,小编整理了IDEA所有的快捷键,让你摆脱鼠…

禁止访问 共享计算机,win7如何禁止局域网用户访问电脑

为了方便共享资源,很多人都会设置网络共享文件夹,但是有些用户觉得在局域网内共享资源是件不安全的事情,那么win7如何禁止局域网用户访问电脑?这里小编就给大家分享一下win7旗舰版32位系统设置用户禁止访问局域网的方法。win7如何禁止局域网…

基于实时深度学习的推荐系统架构设计和技术演进

简介: 整理自 5 月 29 日 阿里云开发者大会,秦江杰和刘童璇的分享,内容包括实时推荐系统的原理以及什么是实时推荐系统、整体系统的架构及如何在阿里云上面实现,以及关于深度学习的细节介绍 本文整理自 5 月 29 日阿里云开发者大会…

阿里云肖力:跳过量变过程的安全质变

简介: 作者肖力从事网络安全工作将近20年,处理过各类攻击威胁,经历了云下云上安全的建设。云计算的安全工作从10年前开始,他们搭建了阿里云平台的防护体系,帮助各行业用户在云上构建企业安全能力。云原生的出现进一步加…

echarts bar 控制大小_echarts基本配置参数

网址&#xff1a;https://www.echartsjs.com/zh/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts五分钟上手 基本配置1.矩形参数<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name&q…

opencv opencl加速_回放 | OpenCV Webinar 3:OpenCV深度学习应用与原理分析

OpenCV DNN模块提供了深度学习的推理&#xff0c;支持Caffe、Tensoflow、Torch、Darknet、ONNX等格式的模型&#xff0c;无需用户安装对应的深度学习框架&#xff0c;也无需进行模型格式转换&#xff0c;直接调用DNN模块接口即可创建深度学习应用。DNN模块自2017年8月3.3版本从…

云原生架构应该怎么设计?

简介&#xff1a; 阿里巴巴为大量各行各业的企业客户提供了基于阿里云服务的解决方案和最佳实践&#xff0c;以帮助企业完成数字化转型&#xff0c;并积累了大量经验和教训。阿里巴巴将企业的核心关注点、企业组织与 IT 文化、工程实施能力等多个方面与架构技术相结合&#xff…

360数科知微实验室发布反诈报告:揭秘黑灰产数据流转真相

近日&#xff0c;360数科旗下信息安全知微实验室通过反诈分析研究&#xff0c;追踪溯源网络黑灰产数据非法交易链条&#xff0c;发布系列反诈研究《黑灰产数据流转分析报告》&#xff08;以下简称“报告”&#xff09;。报告称&#xff0c;目前在网络黑产平台流转的数据主要来源…

【详谈 Delta Lake 】系列技术专题 之 Streaming(流式计算)

简介&#xff1a; 本文翻译自大数据技术公司 Databricks 针对数据湖 Delta Lake 的系列技术文章。众所周知&#xff0c;Databricks 主导着开源大数据社区 Apache Spark、Delta Lake 以及 ML Flow 等众多热门技术&#xff0c;而 Delta Lake 作为数据湖核心存储引擎方案给企业带来…

jdbc驱动程序_JDBC操作数据库的步骤

package mysql;import java.sql.Connection;import java.sql.Driver;import java.sql.DriverManager;/** JDBC操作数据库的步骤* 1.注册驱动* 告知JVM使用的是哪一个数据库驱动* 2.获得连接* 使用JDBC中的类&#xff0c;完成对Mysql数据库连接* 3.获得语句执行平台* 通过连接对…

一睹为快 | 施耐德电气全生命周期智能制造解决方案亮相线上工博

作家瓦科拉夫斯米尔在《国家繁荣为什么离不开制造业》曾说过&#xff1a;“制造业始终是技术创新的基本源泉&#xff0c;也是经济增长的原动力。” 反过来看&#xff0c;技术创新该如何推动制造业的发展&#xff0c;从而促进经济增长呢&#xff1f; 12 月 1 日&#xff0c;在…