注入问题
来源: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 的原因。
10
相似问题