问题描述:
设置两个定时任务,一个定时任务写逻辑付给第二个定时任务执行时间。第一个任务成功执行,把执行时间付给第二个执行任务,打印时间已更新,但第二个任务还是执行老时间,不是第一个赋予的,求大佬帮忙
首先是配置文件:
<?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