Spring quartz Job 의존 주입 사용 상세 설명

3211 단어 Spring의존 주입
Spring quartz Job 의존 주입 사용 상세 설명
1.문제 설명:
Spring 을 사용 하여 quartz 를 통합 하여 동적 작업 을 수행 할 때 job 정시 작업 에서 어떤 서 비 스 를 사용 하려 면@Component,@Autowired 를 직접 주석 을 달 면 주입 할 수 없 으 며 획득 대상 은 Null 입 니 다.다음 코드 와 같이:

@Component 
@PersistJobDataAfterExecution 
@DisallowConcurrentExecution 
public class TicketSalePriceLessThanLowestPriceJob implements Job{ 
 
  @Autowired 
  private XxxService xxxService; 
 
} 
 2.해결 방안:
1.사용자 정의 클래스(CustomJobFactory)를 추가 하고 SpringBeanJobFactory 를 계승 합 니 다.코드 는 다음 과 같 습 니 다.

import org.quartz.spi.TriggerFiredBundle; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.config.AutowireCapableBeanFactory; 
import org.springframework.scheduling.quartz.SpringBeanJobFactory; 
 
public class CustomJobFactory extends SpringBeanJobFactory{ 
 
  @Autowired  
  private AutowireCapableBeanFactory capableBeanFactory;  
  
  @Override  
  protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {  
    //         
    Object jobInstance = super.createJobInstance(bundle);  
    //      
    capableBeanFactory.autowireBean(jobInstance);  
    return jobInstance;  
  } 
   
} 
 
2.spring.xml 파일 에 CustomJobFactory 를 설정 합 니 다.다음 과 같 습 니 다.

<bean id="customJobFactory" class="cn.imovie.manage.task.job.CustomJobFactory"></bean> 
3.사용자 정의 CustomJobFactory 를 org.springframework.scheduling.quartz.scheduler Factory Bean 에 주입 합 니 다.구체 적 으로 다음 과 같 습 니 다.

<property name="jobFactory" ref="customJobFactory"></property> 
 
전체 코드 는 다음 과 같 습 니 다:

<!--        start --> 
  <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">  
    <property name="dataSource" ref="dataSource"></property>   
    <!--  ,QuartzScheduler          Job,         targetObject   qrtz_job_details       -->    
    <property name="overwriteExistingJobs" value="true" />    
     <!--   ,QuartzScheduler     ,       QuartzScheduler     -->   
    <property name="startupDelay" value="10" />   
    <!--        -->   
    <property name="autoStartup" value="true" />  
    <property name="jobFactory" ref="customJobFactory"></property> 
    <property name="applicationContextSchedulerContextKey" value="applicationContextKey" /> 
    <property name="configLocation" value="classpath:spring-quartz.properties" />    
  </bean> 
  <!--        end --> 
4.그리고 Job 작업 클래스 에서@Autowired 를 사용 하여 service 를 주입 할 수 있 습 니 다.
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기