SpringBoot + Quartz 정시 미 션 밟 은 구덩이

  • Scheduler Config. java 정시 퀘 스 트 Job 에서 service 주입 NullPointer Exception [원인]: trigger 가 등록 되 지 않 았 습 니 다. 이상 합 니까?시간 설정 안 하고 실행?
  • 정시 작업 Job 에 service 주입 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  
    */
    

    참고 자료
  • spring boot quartz scheduler example code using maven
  • Quartz (2.1.6) java config with spring (3.2.1). Using a SpringBeanJobFactory to automatically autowire quartz classes.
  • 정시 퀘 스 트 quartz 의 job 에 spring bean 을 주입 할 때 null 의 문제 / zhongruitech. com
  • springboot 통합 quartz 설정 다 중 작업 - 미 완성 공간 - CSDN 블 로그
  • quartz 에서 job 가 실행 되 지 않 는 솔 루 션 (병발 량 이 너무 낮은 이유) - 일반 우리 의 채소밭 - CSDN 블 로그
  • SpringBoot + Quartz
    @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); } }

    좋은 웹페이지 즐겨찾기