qq_45029564 2021-05-26 17:27 采纳率: 0%
浏览 35

quartz任务调用接口报错问题

两个定时任务,第一个定时任务写逻辑计算第二个定时任务。问题是在第二个任务执行时调用接口报错先来报错:这步报错是在调用sevice层方法时报错,感觉很奇怪,求大佬解决

Job DEFAULT.testJob threw an unhandled Exception: 
java.lang.NullPointerException
    at cn.com.zyedu.quartz.task.liveTimingTaskInfo.liveTimingInfo(liveTimingTaskInfo.java:43)
    at cn.com.zyedu.quartz.task.liveTimingTaskInfo.execute(liveTimingTaskInfo.java:26)
    at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)

 

上代码:

配置文件:

<?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" />
            </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>
   
    

    <!-- 注入直播类 -->
    <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 javax.annotation.Resource;
import org.quartz.*;
import org.quartz.impl.JobDetailImpl;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.triggers.CronTriggerImpl;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import cn.com.zyedu.core.system.service.SysParamService;

public class liveTimingTask {

    @Resource
    public SysParamService sysParamService;

    /**
     * 每天18:00点定时启用功能判断是否开启直播配置
     * 
     * @throws ParseException
     * @throws SchedulerException
     */
    public void liveTimingStatus() throws SchedulerException, ParseException{
        String liveTimeStatus = sysParamService.getParamValueByParamKey("LIVE_TIME_STATUS", true);
        
        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);
                        System.out.println("获取提前改变直播状态的时间"+cron);
                         
                        // 构造调度器,使用标准调度器工厂获取默认的调度器
                        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
                        scheduler.start();

                        JobDataMap dataMap = new JobDataMap();
                        dataMap.put("name", "live");

                        // 构造JobDetail,使用默认的JobDetailImpl类
                        JobDetailImpl detail = new JobDetailImpl();
                        detail.setJobClass(liveTimingTaskInfo.class);
                        detail.setJobDataMap(dataMap);
                        detail.setName("testJob");

                        // 构造Trigger,使用CronTrigger
                        CronTriggerImpl cronTrigger = new CronTriggerImpl();
                        cronTrigger.setCronExpression("00 16 17 26 05 ? 2021");// 如果仅需在指定时间执行一次任务,则表达式一般写法为:00 50 15 29 3 ? 2017(表示在2017-03-29 15:50:00执行任务)
                        //cronTrigger.setCronExpression(cron);
                        cronTrigger.setName("testTrigger");

                        // 调度任务
                        scheduler.scheduleJob(detail, cronTrigger);
                    } catch (ParseException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }
        }
    }

    /***
     * 日期转换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);
    }

}
 

 

第二个定时任务:

package cn.com.zyedu.quartz.task;

import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.util.CollectionUtils;

import cn.com.zyedu.core.education.model.Live;
import cn.com.zyedu.core.education.service.LiveService;

public class liveTimingTaskInfo implements Job {

    @Resource
    public LiveService liveService;

    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        JobDataMap map = jobExecutionContext.getJobDetail().getJobDataMap();
        System.out.println("更新直播间状态是否执行" + map.getString("name"));
        this.liveTimingInfo();
    }

    /**
     * 更新直播间状态,具体时间由liveTimingStatus方法赋予
     */
    private void liveTimingInfo() {
        // 获取当天直播的课程
        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<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() + "执行任务");
        }

    }

}
 

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-09-07 18:05
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 stm32开发clion时遇到的编译问题
  • ¥15 lna设计 源简并电感型共源放大器
  • ¥15 如何用Labview在myRIO上做LCD显示?(语言-开发语言)
  • ¥15 Vue3地图和异步函数使用
  • ¥15 C++ yoloV5改写遇到的问题
  • ¥20 win11修改中文用户名路径
  • ¥15 win2012磁盘空间不足,c盘正常,d盘无法写入
  • ¥15 用土力学知识进行土坡稳定性分析与挡土墙设计
  • ¥70 PlayWright在Java上连接CDP关联本地Chrome启动失败,貌似是Windows端口转发问题
  • ¥15 帮我写一个c++工程