SpringBoot + Quartz 정시 미 션 밟 은 구덩이
NullPointerException
[원인]: 생 성 된 서 비 스 는 Quartz 가 관리 하 는 것 입 니 다. Spring 이 아니 라 Job 에 주입 할 수 없 는 인 스 턴 스 는 반 사 된 인 스 턴 스 를 통 해 spring 의 관 리 를 받 지 않 습 니 다 @Autowired
private ApplicationContext applicationContext;
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactoryBean(Trigger trigger) {
SchedulerFactoryBean factoryBean = new SchedulerFactoryBean();
// quartz ,QuartzScheduler job
factoryBean.setOverwriteExistingJobs(true);
// , 1
factoryBean.setStartupDelay(1);
//
factoryBean.setTriggers(trigger);
// Spring null
SpringQuartzJobFactory jobFactory = new SpringQuartzJobFactory();
jobFactory.setApplicationContext(applicationContext);
factoryBean.setJobFactory(jobFactory);
return factoryBean;
}
@ Autowired 빈 포인터 Null 문 제 를 해결 합 니 다. 즉, 주입 에 의존 하 는 속성 은 null 입 니 다.
SpringQuartzJobFactory.java
applicationContext
@Component("springQuartzJobFactory")
public class SpringQuartzJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
@Autowired
private AutowireCapableBeanFactory beanFactory;
@Override
public void setApplicationContext(final ApplicationContext context) throws BeansException {
beanFactory = context.getAutowireCapableBeanFactory();
}
@Override
protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
Object obj = super.createJobInstance(bundle);
beanFactory.autowireBean(obj);
return obj;
}
}
/*
AutowiringSpringBeanJobFactory quartz SpringBeanJobFactory(job )
ApplicationContextAware set ApplicationContextAware( ) job 。
super.createJobInstance(bundle) job, beanFactory autowired job
*/
참고 자료
@Bean(name = "psBnAbsNoticeJobDetail")
public JobDetailFactoryBean psBnAbsNoticeJobDetail()
{
JobDetailFactoryBean psBnAbsNoticeFactory = new JobDetailFactoryBean();
psBnAbsNoticeFactory.setJobClass(PsBnAbsNoticeTask.class);
psBnAbsNoticeFactory.setName("PsBnAbsNoticeTask");
psBnAbsNoticeFactory.setDescription("push abnormal attendance notice");
psBnAbsNoticeFactory.setDurability(true);
return psBnAbsNoticeFactory;
}
/**
* 5 ( )
* jobDtail trigger
*/
@Bean(name = "psBnAbsNoticeJobTrigger")
public CronTriggerFactoryBean psBnAbsNoticeJobTrigger(@Qualifier("psBnAbsNoticeJobDetail") JobDetail job)
{
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(job);
trigger.setCronExpression("0 */1 * * * ?");
return trigger;
}
/*
*
*/
@PersistJobDataAfterExecution
public class PsBnAbsNoticeTask extends QuartzJobBean {
private static final Logger logger = LoggerFactory.getLogger(PsBnAbsNoticeTask.class);
@Autowired
PsBnAbsDetailedService psbnAbsDetailedService;
@Autowired
HrConfig hrConfig;
@Override
protected void executeInternal(JobExecutionContext context) {
logger.info(" --- PsBnAbsNoticeTask --- " + new Date());
// ,
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE,-1);
Date time = calendar.getTime();
String yesterday = new SimpleDateFormat("yyyy-MM-dd").format(time);
List entityList = psbnAbsDetailedService.getPsBnAbsNoticeDetailed(yesterday);
for (PsBnAbsDetailedEntity entity: entityList) {
if (entity.getEmpLid()== null) {
continue;
}
pushPsBnAbsNotice(entity);
}
logger.info(" --- PsBnAbsNoticeTask --- " + new Date());
}
private void pushPsBnAbsNotice(PsBnAbsDetailedEntity entity) {
Map param = new HashMap<>();
param.put("from", " ");
param.put("to", entity.getEmpLid());
param.put("type", 80);
param.put("source", "bpm");
Map content = new HashMap<>();
String detail = "";
if (entity.getBnAmAbstype().equals("2")) {
detail += " :
";
}
if (entity.getBnNmAbstype().equals("2")) {
detail += " :
";
}
if (entity.getBnPmAbstype().equals("2")) {
detail += " :
";
}
String qhAbsDate = DateUtil.toStandardDateStr(entity.getQhAbsDate());
content.put("title", " ("+qhAbsDate+")");
String substance = " , !
:"+entity.getEmpLid()+"
"+detail+" :"+qhAbsDate;
content.put("substance", substance);
param.put("content", content);
//
String reqStr = JSONObject.toJSONString(param);
String url = hrConfig.getMoaApiSendMsg();
doPostJson(url, reqStr);
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.