복붙노트

[SPRING] 쿼츠를 사용한 데이터 검색

SPRING

쿼츠를 사용한 데이터 검색

Quartz를 사용하여 데이터베이스에서 데이터를 검색하는 데 도움이 필요합니다. 주 클래스의 config.xml에서 최대 절전 모드 속성을 읽고 NULL 포인터 예외가 발생하는 작업 클래스 (Quartz Process.java)에서 데이터를 검색하려고 시도한 속성을 사용하고 있습니다.

문제 해결을 도와주세요. 감사와 진보

이것이 나의 주요 수업이다.

@Component("TestProgram")

public class TestProgram
{
        static ClassPathXmlApplicationContext applicationContext=null;

    public void testMethod() throws SchedulerException
    {
        JobDetail job = new JobDetail();
        job.setName("Retriving The Master Details");
        job.setJobClass(QuartzProcess.class);


        SimpleTrigger trigger = new SimpleTrigger();
        trigger.setName("Trigger For Retriving The Master Details");
        trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        trigger.setRepeatInterval(5000);

        Scheduler scheduler = new StdSchedulerFactory().getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
    }

    public static void main(String[] args) throws Exception
    {
        String conf[] = {"Config.xml"};
        applicationContext= new ClassPathXmlApplicationContext(conf);
        TestProgram unittest=applicationContext.getBean(TestProgram.class);     
        unittest.testMethod();
    }

}

석영 Process.java

@Component("QuartzProcess")

public class QuartzProcess implements Job
{
    @Autowired
    private MasterService MasterService;


    @Override   
        public void execute(JobExecutionContext jec) throws JobExecutionException
        {
         try
         {


             List<MasterVO> MasterVO=MasterService.findAll();
             System.out.println("MasterVO..."+MasterVO);
             for(int index=0;index<MasterVO.size();index++)
                 System.out.println(MasterVO.get(index));



         }
         catch(Exception e)
         {
             e.printStackTrace();
         }
        }   
}

해결법

  1. ==============================

    1.Quartz 작업이 Spring에 의해 인스턴스화되지 않고 SpringContext 외부에서 실행되므로 내부에서 참조하는 모든 bean이 null이 될 수 있으므로 널 포인터 예외가 발생한다. 이제 쿼츠 욥 내부의 봄 콩에 접근하는 몇 가지 방법이 있습니다.

    Quartz 작업이 Spring에 의해 인스턴스화되지 않고 SpringContext 외부에서 실행되므로 내부에서 참조하는 모든 bean이 null이 될 수 있으므로 널 포인터 예외가 발생한다. 이제 쿼츠 욥 내부의 봄 콩에 접근하는 몇 가지 방법이 있습니다.

    1) applicationContext에 아래 빈을 정의한다.

    <bean id="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
      <property name="configLocation">
         <value>classpath:quartz.properties</value>
      </property>
      <property name="applicationContextSchedulerContextKey">
        <value>applicationContext</value>
      </property>
    

    테스트 클래스에서 위의 Bean 스케줄러를 얻으십시오. 테스트 클래스의 코드는 다음과 같습니다.

    public void testMethod() throws SchedulerException
    {
        JobDetail job = new JobDetail();
        job.setName("Retriving The Master Details");
        job.setJobClass(QuartzProcess.class);
    
    
        SimpleTrigger trigger = new SimpleTrigger();
        trigger.setName("Trigger For Retriving The Master Details");
        trigger.setStartTime(new Date(System.currentTimeMillis() + 1000));
        trigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
        trigger.setRepeatInterval(5000);
    
    
        scheduler.scheduleJob(job, trigger);
    }
    

    스케쥴러 빈은 평범한 방식으로 메인 클래스에 있어야한다. 스케쥴러가 spring containter에 의해 시작되므로 scheduler.start를 수행 할 필요가 없습니다.

    QuartzProcess 클래스에서 아래 메소드를 추가하여 applicationContext를 얻어야한다.

        public ApplicationContext getApplicationContext(JobExecutionContext context) throws Exception {
            ApplicationContext applicationContext = null;
            applicationContext = (ApplicationContext) context.getScheduler().getContext().get(APPLICATION_CONTEXT_KEY);
            if (applicationContext == null) {
                throw new JobExecutionException("No application context available in scheduler context for key \""
                                                + APPLICATION_CONTEXT_KEY
                                                + "\"");
            }
            return applicationContext;
        }
    

    그런 다음 quartzprocess의 xecute 메소드에서 필요한 bean을 얻으려면 코드 아래에서 수행해야합니다.

      ApplicationContext ctx = getApplicationContext(context);
      QuartzProcess quartzProcess = (QuartzProcess)ctx.getBean("quartzProcess");
    
  2. ==============================

    2.Spring Task를 사용하는 방법에 대해 데이터베이스를 업데이트하는 예약 된 작업을 생성하려는 경우.

    Spring Task를 사용하는 방법에 대해 데이터베이스를 업데이트하는 예약 된 작업을 생성하려는 경우.

    다음은 그 예입니다. 스프링 작업을 사용하여 예약 된 작업을 중지하는 방법

    그런 다음 데이터베이스 업데이트를 수행하는 메서드를 호출하면됩니다.

  3. from https://stackoverflow.com/questions/12707383/data-retrieval-using-quartz by cc-by-sa and MIT license