注入问题

来源:6-3 使用了 @Autowired 注解,但是仍然出现了空指针

清楚的楚

2022-02-01

package com.xxkj.quartz.means;

import com.xxkj.quartz.domain.QuartzJobLogEntity;
import com.xxkj.quartz.service.impl.QuartzJobEntityServiceImpl;
import com.xxkj.quartz.service.impl.QuartzJobLogEntityServiceImpl;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Date;

/**
 * 抽象quartz调用
 */
public abstract class AbstractQuartzJob implements Job {

    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
    /**
     * 线程本地变量
     */
    private static final ThreadLocal<QuartzJobLogEntity> threadLocal = new ThreadLocal<QuartzJobLogEntity>(){
        @Override
        protected QuartzJobLogEntity initialValue(){
            return new QuartzJobLogEntity();
        }
    };
    
    /*@Resource
    private QuartzJobLogEntityServiceImpl quartzJobLogEntityService;*/

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException{
        JobKey jobKey = context.getJobDetail().getKey();
        String group = jobKey.getGroup();
        String name = jobKey.getName();
        QuartzJobLogEntity quartzJobLogEntity = threadLocal.get();
        quartzJobLogEntity.setJobName(name);
        quartzJobLogEntity.setJobGroup(group);
        quartzJobLogEntity.setDescription(context.getJobDetail().getDescription());

        log.info("所属["+group+"]组的定时任务:["+name+"]开始执行……");
        LocalDateTime date = LocalDateTime.now();
        quartzJobLogEntity.setStartTime(date);
        long runMs;
        try {
            //before();
            doExecute(context);
            //after(context);
            LocalDateTime dateAfter = LocalDateTime.now();
            quartzJobLogEntity.setEndTime(dateAfter);
            runMs = dateAfter.toInstant(ZoneOffset.of("+8")).toEpochMilli() - date.toInstant(ZoneOffset.of("+8")).toEpochMilli();
            threadLocal.remove();
            log.info("所属["+jobKey.getGroup()+"]组的定时任务:["+jobKey.getName()+"]执行完成,执行耗时:"+runMs+"毫秒。");
            quartzJobLogEntity.setExecState("0");
            
             /*这一段换成@Resource
    private QuartzJobLogEntityServiceImpl quartzJobLogEntityService;
		    这种写法就会报空指针异常*/
            SpringUtils.getBean(QuartzJobLogEntityServiceImpl.class).insertJogLog(quartzJobLogEntity);
        } catch (Exception e) {
            threadLocal.remove();
            quartzJobLogEntity.setErrInfo(e.getMessage());
            quartzJobLogEntity.setExecState("1");
            log.error("所属["+group+"]组的定时任务:["+name+"]执行出现异常:"+e.getMessage());
            /*这一段换成@Resource
    private QuartzJobLogEntityServiceImpl quartzJobLogEntityService;
		    这种写法就会报空指针异常*/
            SpringUtils.getBean(QuartzJobLogEntityServiceImpl.class).insertJogLog(quartzJobLogEntity);
        }

        /*SysJob sysJob = new SysJob();
        BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
        try
        {
            before(context, sysJob);
            if (sysJob != null)
            {
                doExecute(context, sysJob);
            }
            after(context, sysJob, null);
        }
        catch (Exception e)
        {
            log.error("任务执行异常  - :", e);
            after(context, sysJob, e);
        }*/
    }


    /**
     * 执行方法,由子类重载
     *
     * @param context 工作执行上下文对象
     * @throws Exception 执行过程中的异常
     */
    protected abstract void doExecute(JobExecutionContext context) throws Exception;
}

/这一段换成@Resource
private QuartzJobLogEntityServiceImpl quartzJobLogEntityService;
这种写法就会报空指针异常
/
SpringUtils.getBean(QuartzJobLogEntityServiceImpl.class).insertJogLog(quartzJobLogEntity);

老师看看这个问题是什么原因,和quartz的线程池有关系吗

写回答

1回答

张勤一

2022-02-02

同学你好:

    这段代码逻辑有些混乱,初看上去,似乎是 AbstractQuartzJob 没有定义为 Spring Bean 的原因。

1
0

Java实操避坑指南 SpringBoot/MySQL/Redis错误详解

掌握业务开发中各种类型的坑,,Java web开发领域通用

466 学习 · 204 问题

查看课程