版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_39657597/article/details/81910715
1.pom配置
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
2.创建job
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.alibaba.fastjson.JSON;
public class TestJob implements Job{
//这里会有一个问题,就是在spring执行job的时候,job里Bean不能使用@Autowired注入 !
//下面在写解决办法
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("job执行< --- >jobMap:"+JSON.toJSONString(context.getMergedJobDataMap()));
}
}
3.使用job
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
import test.job.TestJob;
public class Test1 {
public static void main(String[] args) throws SchedulerException, InterruptedException {
System.out.println("---开始---");
Map<String,Object> map=new HashMap<String, Object>();
map.put("name","张三");
task(new TestJob(),map,"task1",new Date(System.currentTimeMillis() + 5000));
System.out.println("--结束---");
//delTask("task1");
for(int i=1;i<=10;i++) {
Thread.sleep(1000);
System.out.println("time:"+i);
}
}
/**
* 删除任务
*/
private static void delTask(String key) throws SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.deleteJob(new JobKey(key));
}
/**
* 创建任务
*/
private static void task(Job job,Map<String,Object> param,String key,Date date) throws SchedulerException {
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// 开始
scheduler.start();
// job 唯一标识 test.test-1
JobKey jobKey = new JobKey(key);
if(scheduler.checkExists(jobKey)) return;//任务已存在
JobDataMap map=new JobDataMap(param);//传到参数
JobDetail jobDetail = JobBuilder.newJob(job.getClass()).withIdentity(jobKey).setJobData( map).build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(key)
// 执行时间
.startAt(date)
.build();
scheduler.scheduleJob(jobDetail , trigger);
}
}
Console:
---开始---
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
--jieshu---
time:1
time:2
time:3
time:4
time:5
job执行< --- >jobMap:{"name":"张三"}
time:6
time:7
time:8
time:9
time:10
Spring里job不能注入service的解决办法:
1.使用工具类创建service,不用spring自动注入
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
@Component
public class ApplicationContextUtil implements ApplicationContextAware{
private static ApplicationContext applicationContext;
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
public void setApplicationContext(ApplicationContext applicationContext) {
ApplicationContextUtil.applicationContext = applicationContext;
}
//这里只写了根据id来获取bean,可以根据自己的需求在作更改
public static Object getBean(String BeanName){
return applicationContext.getBean(BeanName);
}
}
service=(ISystemMessagesService) ApplicationContextUtil.getBean("systemMessagesService");
2.配置spring
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.2.6.RELEASE</version>
</dependency>
public class JobFactory extends AdaptableJobFactory {
@Autowired
private AutowireCapableBeanFactory capableBeanFactory;
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
//调用父类的方法
Object jobInstance = super.createJobInstance(bundle);
//进行注入
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
<bean id="jobFactory" class="com.vision.job.JobFactory"></bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory"></property>
</bean>
搞定,现在我们的job里就可以使用@Autowired自动注入Bean了
那么为什么在job里,@Autowired注解不起作用呢?
这是因为我们在执行job的时候quartz就会重新实例化一个job,这个job和Spring注入的其他实例是不同的,所以@Autowired无法将实现注入到job中。