Spring+Quartz配置

1 篇文章 0 订阅
1 篇文章 0 订阅

Quartz由于之前项目有用到,所以就写下来了,方便以后查看(具体的包就不写出来了,用**表示)
任务实体类ScheduleJob.class

public class ScheduleJob implements Serializable{

     /**
     * 
     */
    private static final long serialVersionUID = 1L;

    /** 任务id */
    private String jobId;
    /** 任务名称 */
    private String jobName;
    /** 任务分组 */
    private String jobGroup;
    /** 任务状态 0禁用 1启用 2删除*/
    private String jobStatus;
    /** 任务运行时间表达式 */
    private String cronExpression;
    /** 任务描述 */
    private String desc;

    public ScheduleJob() {
        super();
    }
    @Id
    @Column(nullable=false,unique=true)
    public String getJobId() {
        return jobId;
    }
    public void setJobId(String jobId) {
        this.jobId = jobId;
    }
    @Column(length=50)
    public String getJobName() {
        return jobName;
    }
    public void setJobName(String jobName) {
        this.jobName = jobName;
    }
    @Column(length=50)
    public String getJobGroup() {
        return jobGroup;
    }
    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }
    @Column(length=2)
    public String getJobStatus() {
        return jobStatus;
    }
    public void setJobStatus(String jobStatus) {
        this.jobStatus = jobStatus;
    }
    @Column(length=50)
    public String getCronExpression() {
        return cronExpression;
    }
    public void setCronExpression(String cronExpression) {
        this.cronExpression = cronExpression;
    }
    @Column(name="jobDesc",length=50)
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
}

applicationContext.xml

<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobFactory">
            <bean class="com.**.quzrtz.MyJobFactory" />
        </property>
    </bean>

这里需要注意的是写了一个任务工厂,这样才能让Quartz的Job使用Spring注入的Bean,否则在QuartzJobFactory中你是获取不到bean对象的。
MyJobFactory.class继承了SpringBeanJobFactory重写他的createJobInstance方法

public class MyJobFactory extends SpringBeanJobFactory{

    @Autowired
    private AutowireCapableBeanFactory beanFactory;

     /**

     * 这里覆盖了super的createJobInstance方法,对其创建出来的类再进行autowire。

     */

    @Override

    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {

        Object jobInstance = super.createJobInstance(bundle);

        beanFactory.autowireBean(jobInstance);

        return jobInstance;

    }
}

QuartzJobFactory.class

public class QuartzJobFactory implements Job{

    private static Logger logger = Logger.getLogger(QuartzJobFactory.class);
    public static Map<String, ScheduleJob> jobMap = new HashMap<String, ScheduleJob>();
    private static final String APPLICATION_CONTEXT_KEY = "applicationContextKey";

    @Autowired
    private AdminService adminService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("任务成功运行");
                ScheduleJob scheduleJob = (ScheduleJob)context.getMergedJobDataMap().get("scheduleJob");
                System.out.println("任务名称 = [" + scheduleJob.getJobName() + "]");
                //这里可以调用上面获取的springbean对象adminService
    }

    public static void addJob(ScheduleJob scheduleJob) {
        jobMap.put(scheduleJob.getJobGroup() + "_" + scheduleJob.getJobName(), scheduleJob);
    }

    public static void initJob(SchedulerFactoryBean schedulerFactoryBean,ScheduleJobService scheduleJobService){
        //schedulerFactoryBean 由spring创建注入
        Scheduler scheduler = schedulerFactoryBean.getScheduler();
        //这里获取任务信息数据
        List<ScheduleJob> jobList = scheduleJobService.findList();
        if(jobList == null || jobList.isEmpty()){
            ScheduleJob job = new ScheduleJob();
            job =  new ScheduleJob();
            job.setJobId(IdGen.uuid());
            job.setJobName("任务:"+IdGen.uuid());
            job.setJobGroup("dataWork");
            job.setJobStatus("1");
            job.setCronExpression("0 0 0 * * ?");
            job.setDesc("数据导入任务");
            scheduleJobService.save(job);
            jobList.add(job);
        }
        for (ScheduleJob job : jobList) {
            TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobName(), job.getJobGroup());
            //获取trigger,即在spring配置文件中定义的 bean id="myTrigger"
            CronTrigger trigger = null;
            try {
                trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            } catch (SchedulerException e) {
                e.printStackTrace();
            }
            //不存在,创建一个
            if (null == trigger) {
                JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactory.class)
                    .withIdentity(job.getJobName(), job.getJobGroup()).build();
                jobDetail.getJobDataMap().put("scheduleJob", job);
                //表达式调度构建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job
                    .getCronExpression());
                //按新的cronExpression表达式构建一个新的trigger
                trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobName(), job.getJobGroup()).withSchedule(scheduleBuilder).build();
                try {
                    scheduler.scheduleJob(jobDetail, trigger);
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            } else {
                // Trigger已存在,那么更新相应的定时设置
                //表达式调度构建器
                CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job
                    .getCronExpression());
                //按新的cronExpression表达式重新构建trigger
                trigger = trigger.getTriggerBuilder().withIdentity(triggerKey)
                    .withSchedule(scheduleBuilder).build();
                //按新的trigger重新设置job执行
                try {
                    scheduler.rescheduleJob(triggerKey, trigger);
                } catch (SchedulerException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

我需要在服务器启动时就调用它,所以需要写一个spring监听器
ServiceListener.class

public class ServiceListener implements ApplicationListener<ContextRefreshedEvent>{

    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;
    @Autowired
    private ScheduleJobService scheduleJobService;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        System.out.println("服务器启动。。。");
        WeixinUtil.deleteMenu();
        WeixinUtil.createMenu();
         final ApplicationContext app = event.getApplicationContext();
          if (null == app.getParent()
            && "Root WebApplicationContext".equals(app.getDisplayName())) { 
              QuartzJobFactory.initJob(schedulerFactoryBean,scheduleJobService);
          }
    }



}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值