Java Quartz实现定时任务

版权声明:版权声明:本文为博主原创文章,未经博主允许不得转载。 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中。

猜你喜欢

转载自blog.csdn.net/qq_39657597/article/details/81910715