quartz设置两个定时任务的问题

问题描述:

设置两个定时任务,一个定时任务写逻辑付给第二个定时任务执行时间。第一个任务成功执行,把执行时间付给第二个执行任务,打印时间已更新,但第二个任务还是执行老时间,不是第一个赋予的,求大佬帮忙

 

首先是配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

    <!-- quartz定时任务配置 -->
    <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <!-- 加入直播是否提前时间配置和时间配置内容  -->
                <ref bean="liveTimingStatusTaskTrigger" />
                <ref bean="liveTimingInfoTaskTrigger" />
            </list>
        </property>
    </bean>
    
    <!-- 直播判断是否触发提前时间配置 每日下午18:00分执行一次 -->
    <bean id="liveTimingStatusTaskTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail"> 
             <ref bean="liveTimingStatusDetail" />
        </property>
        <property name="cronExpression" value="00 36 09 26 05 ? 2021" />
        <!-- <property name="cronExpression" value="0 0 18 * * ?" /> -->
    </bean>
    <bean id="liveTimingStatusDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 调用直播定时类 -->
        <property name="targetObject">
            <ref bean="liveTimingTask" />
        </property>
        <!-- 调用直播类中的方法 -->
        <property name="targetMethod">
            <value>liveTimingStatus</value>
        </property>
        <property name="concurrent" value="false" />
    </bean>
    <!-- 直播提前时间配置内容 具体执行时间由liveTiming方法返回 -->
    <bean id="liveTimingInfoTaskTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail"> 
             <ref bean="liveTimingIofoDetail" />
        </property>
         <property name="cronExpression"><value>59 59 23 31 12 ? 2099</value></property> 
        <!-- <property name="cronExpression" value="59 59 23 31 12 ? 2099" />  -->
    </bean>
    <bean id="liveTimingIofoDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <!-- 调用直播定时类 -->
        <property name="targetObject">
            <ref bean="liveTimingTask" />
        </property>
        <!-- 调用直播类中的方法 -->
        <property name="targetMethod">
            <value>liveTimingInfo</value>
        </property>
        <property name="concurrent" value="false" />
    </bean>
    

    <!-- 注入直播类 -->
    <bean id="liveTimingTask"
        class="cn.com.zyedu.quartz.task.liveTimingTask"></bean>
</beans>

 

 

其次是Java类:

package cn.com.zyedu.quartz.task;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.annotation.Resource;

import org.quartz.*;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import cn.com.zyedu.core.education.model.Live;
import cn.com.zyedu.core.education.service.LiveService;
import cn.com.zyedu.core.system.service.SysParamService;

public class liveTimingTask {

    @Resource
    public LiveService liveService;
    @Resource
    public SysParamService sysParamService;

    private Scheduler scheduler;

    // 设值注入,通过setter方法传入被调用者的实例scheduler
    public void setScheduler(Scheduler scheduler) {
        this.scheduler = scheduler;
    }

    /**
     * 每天18:00点定时启用功能判断是否开启直播配置
     * 
     * @throws ParseException
     * @throws SchedulerException
     */
    public void liveTimingStatus() {
        String liveTimeStatus = sysParamService.getParamValueByParamKey("LIVE_TIME_STATUS", true);
        System.out.println("我是第一个任务");
        if (null != liveTimeStatus && !"".equals(liveTimeStatus)) {
            // 获取参数表是否开启直播数据 1开启0未开启
            if ("1".equals(liveTimeStatus)) {
                // 获取直播提前的时间配置
                Integer liveAdvanceTiming = Integer
                        .valueOf(sysParamService.getParamValueByParamKey("LIVE_ADVANCE_TIMING", true));
                if (null != liveAdvanceTiming && !"".equals(liveAdvanceTiming)) {
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Calendar nowTime = Calendar.getInstance();
                    // 当前时间固定20:00点
                    nowTime.set(nowTime.get(Calendar.YEAR), nowTime.get(Calendar.MONTH),
                            nowTime.get(Calendar.DAY_OF_MONTH), 20, 0, 0);
                    nowTime.add(Calendar.MINUTE, -liveAdvanceTiming);
                    String time1 = sdf.format(nowTime.getTime());
                    Date time2;
                    try {
                        time2 = sdf.parse(time1);
                        // date转换con时间
                        String cron = this.getCron(time2);

                        TriggerKey triggerKey = TriggerKey.triggerKey("liveTimingInfoTaskTrigger",
                                "liveTimingInfoTaskTrigger");
                        // 将时间返给配置文件
                        WebApplicationContext data = ContextLoader.getCurrentWebApplicationContext();
                        CronTriggerImpl sptTrigger = (CronTriggerImpl) data.getBean("liveTimingInfoTaskTrigger");
                        sptTrigger.setCronExpression("00 38 09 26 05 ? 2021");

                        // sptTrigger.setCronExpression(cron);

                        try {

                            //scheduler.scheduleJob(sptTrigger);
                            //if (!scheduler.isShutdown()) {
                              //  scheduler.start();
                          //  }
                        } catch (SchedulerException e) {
                            e.printStackTrace();
                            // TODO Auto-generated catch block
                            e.printStackTrace();
                        }

                        // this.modifyJobTime("liveTimingInfoTaskTrigger","liveTimingInfoTaskTrigger","liveTimingInfoTaskTrigger","liveTimingInfoTaskTrigger","00
                        // 48 15 25 05 ? 2021");

                        System.out.println("获取更新的执行时间=" + sptTrigger.getCronExpression());
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            } else {
                // 如果没有直播将第二次任务设置为不执行
                WebApplicationContext data = ContextLoader.getCurrentWebApplicationContext();
                CronTriggerImpl sptTrigger = (CronTriggerImpl) data.getBean("liveTimingInfoTaskTrigger");
                try {
                    sptTrigger.setCronExpression("59 59 23 31 12 ? 2099");
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }


    public void modifyJobTime(String jobName, String jobGroupName, String triggerName, String triggerGroupName,
            String cron) {
        try {
            // Scheduler sched = scheduler.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName);
            CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
            if (trigger == null) {
                return;
            }

            String oldTime = trigger.getCronExpression();
            if (!oldTime.equalsIgnoreCase(cron)) {
                /** 方式一 :调用 rescheduleJob 开始 */
                // 触发器
                TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
                // 触发器名,触发器组
                triggerBuilder.withIdentity(triggerName, triggerGroupName);
                triggerBuilder.startNow();
                // 触发器时间设定
                triggerBuilder.withSchedule(CronScheduleBuilder.cronSchedule(cron));
                // 创建Trigger对象
                trigger = (CronTrigger) triggerBuilder.build();
                // 方式一 :修改一个任务的触发时间
                scheduler.rescheduleJob(triggerKey, trigger);
                /** 方式一 :调用 rescheduleJob 结束 */

                /** 方式二:先删除,然后在创建一个新的Job */
                // JobDetail jobDetail = sched.getJobDetail(JobKey.jobKey(jobName,
                // jobGroupName));
                // Class<? extends Job> jobClass = jobDetail.getJobClass();
                // removeJob(jobName, jobGroupName, triggerName, triggerGroupName);
                // addJob(jobName, jobGroupName, triggerName, triggerGroupName, jobClass, cron);
                /** 方式二 :先删除,然后在创建一个新的Job */
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 更新直播间状态,具体时间由liveTimingStatus方法赋予
     */
    public void liveTimingInfo() {
        System.out.println("我是第二个任务");
        WebApplicationContext data = ContextLoader.getCurrentWebApplicationContext();
        CronTriggerImpl sptTrigger = (CronTriggerImpl) data.getBean("liveTimingInfoTaskTrigger");
        System.out.println(sptTrigger.getCronExpression() + "测试是否执行更新库任务");
        // 获取当天直播的课程
        Calendar calendar1 = Calendar.getInstance();
        calendar1.set(calendar1.get(Calendar.YEAR), calendar1.get(Calendar.MONTH), calendar1.get(Calendar.DAY_OF_MONTH),
                0, 0, 0);
        Date beginOfDate = calendar1.getTime();

        Calendar calendar2 = Calendar.getInstance();
        calendar2.set(calendar2.get(Calendar.YEAR), calendar2.get(Calendar.MONTH), calendar2.get(Calendar.DAY_OF_MONTH),
                23, 59, 59);
        Date endOfDate = calendar2.getTime();

        //这里是到后台查询数据,返回list,从这里-service-imp-dao-xml的sql就省略了。毕竟现在的问题是如何进入第二个任务
        List<Live> datas = liveService.selectNowLiveCourse(beginOfDate, endOfDate);

        // 更新当天直播课程状态
        if (!CollectionUtils.isEmpty(datas)) {
            Live live = new Live();
            for (Live item : datas) {
                live.setIsavailable(1);
                live.setLiveId(item.getLiveId());
                liveService.updateLive(live);
            }
            System.out.println(new Date() + "执行任务");
        }

    }

    /***
     * 日期转换cron表达式
     * 
     * @param date
     * @param dateFormat : e.g:yyyy-MM-dd HH:mm:ss
     * @return
     */
    public static String formatDateByPattern(Date date, String dateFormat) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
        String formatTimeStr = null;
        if (date != null) {
            formatTimeStr = sdf.format(date);
        }
        return formatTimeStr;
    }

    /***
     * convert Date to cron ,eg. "0 07 10 15 1 ? 2016"
     * 
     * @param date : 时间点
     * @return
     */
    public static String getCron(Date date) {
        String dateFormat = "ss mm HH dd MM ? yyyy";
        return formatDateByPattern(date, dateFormat);
    }

}
 

定时任务的时间都是启动的时候注入的,如果要动态改变的话应该要重新创建一个定时任务吧。

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632