![b104d894843d8e2d6f1dcde10c970117.png](https://i-blog.csdnimg.cn/blog_migrate/e827b254a9fd99ee6c6f355f074723d5.jpeg)
跨年篇:祝愿大家万事随心,吃饭吃得饱,睡觉睡得好,没有烦扰。
一、背景
我在Job实现类中使用@Resource和@Autowired注入mapper类时,出现了如下的错误:
2020-12-31 20:41:07.311 ERROR 22456 --- [eduler_Worker-5] org.quartz.core.ErrorLogger : Job (repeat.test2 threw an exception.
org.quartz.SchedulerException: Job threw an unhandled exception.
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
Caused by: java.lang.NullPointerException: null
at com.example.docker_images.job.HelloJob.execute(HelloJob.java:26)
at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
... 1 common frames omitted
- 为啥会有空指针?
答:出现这个原因是没有注入成功,所以为null,再通过这个对象调用mapper的方法不报错才怪。
- 这里你会很奇怪吧,明明使用了@Resource和@Autowired来注入,为什么注入后的对象还是null呢?
答:这里我来解释一下,这个是因为Job的实现类并没有加入到spring容器中,自然无法使用自动注入。
- 那进入今天的主题吧,怎么在Job实现类中使用spring的自动注入呢?
答:自然是将Job加入到Spring容器中,然后就可以执行自动注入了。 事先申明一下,这篇文章是在quartz(三)任务持久化-jdbc篇(一看就会)上优化的,有兴趣的可以看一下三。注入方式如下:
二、代码实现
通用代码(在三的基础上加了数据库的操作):
import com.example.docker_images.entity.User;
import com.example.docker_images.entity.common.CwConstant;
import com.example.docker_images.service.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import javax.annotation.Resource;
import java.util.List;
@Slf4j
public class HelloJob implements Job {
@Resource
private IUserService iUserService;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
//通过jobDetail获取数据
String payload = context.getTrigger().getJobDataMap().getString(CwConstant.PAYLOAD);
System.out.println(payload);
System.out.println("hello world!!!");
List<User> list = iUserService.list();
System.out.println(list.size());
}
}
1. pom配置
<!-- Quartz坐标 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<!--springboot-quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2. 通过配置类将spring上下文注入到JobFactory中
- spring容器操作类
import org.quartz.spi.TriggerFiredBundle;
im