2011-01-27 6 views
4

스프링 쿼츠 스케줄러를 사용하고 있지만 XML 파일을 사용하고 있지 않습니다. 프로그래밍 방식으로 전체 구성을 만들고 싶습니다.프로그래밍 방식으로 트리거 객체를 만드는 방법은 무엇입니까?

다음 코드를 작성했습니다.

package com.eaportal.service.impl; 

import java.text.ParseException; 
import java.util.Date; 
import java.util.HashMap; 
import java.util.Map; 

import org.quartz.JobDetail; 
import org.springframework.scheduling.SchedulingException; 
import org.springframework.scheduling.quartz.CronTriggerBean; 
import org.springframework.scheduling.quartz.JobDetailBean; 
import org.springframework.scheduling.quartz.SchedulerFactoryBean; 

import com.eaportal.service.intfc.AuctionWinnerService; 

public class NormalAuctionWinnerServiceImpl1 implements AuctionWinnerService { 

    @SuppressWarnings("deprecation") 
    public void declareWinner(int auctionId, Map<String, Object> parameterMap) { 
     System.out.println("INSIDE DECLARE WINNER METHOD."); 
     /** STEP 1 : INSTANTIATE TASK CLASS **/ 
     NormalAuctionWinnerTask1 runMeTask = new NormalAuctionWinnerTask1(); 
     System.out.println("FINISHED STEP 1"); 

     /** STEP 2 : INSTANTIATE JOB DETAIL CLASS AND SET ITS PROPERTIES **/ 
     Map<String,Object> jobDataAsMap = new HashMap<String,Object>(); 
     jobDataAsMap.put("runMeTask",runMeTask); 
     JobDetailBean jdb = new JobDetailBean(); 
     jdb.setJobClass(NormalAuctionWinnerTask1.class); 
     jdb.setJobDataAsMap(jobDataAsMap); 
     System.out.println("FINISHED STEP 2"); 

     /** STEP 3 : INSTANTIATE CRON TRIGGER AND SET ITS PROPERTIES **/ 
     CronTriggerBean ctb = new CronTriggerBean(); 
     Date d1 = new Date(); 
     Date d2 = new Date(); 
     d2.setMinutes(d1.getMinutes()+10); 
     ctb.setStartTime(d1); 
     ctb.setEndTime(d2); 
     ctb.setJobDetail(jdb); 

     try { 
      ctb.setCronExpression("59 * * * * ? *"); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 

     /** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/ 
     SchedulerFactoryBean sfb = new SchedulerFactoryBean(); 
     sfb.setJobDetails(new JobDetail[]{jdb}); 
     try { 
      sfb.start(); 
     } catch (SchedulingException e) { 
      e.printStackTrace(); 
     } 
    } 

} 

방아쇠가 발사되지 않는 것을 제외하고 코드가 작동하고 있습니다. 설정하지 않았습니다.

여기서 문제는 XML 설정에서 우리는 schedulerFactoryBean의 'triggers'속성을 가지고 있으며 list를 사용하여 트리거를 구성합니다.

그러나 프로그래밍 방식으로 동일한 속성을 설정할 수 없습니다. Trigger 배열을 허용하는 SchedulerFactoryBean의 setTriggers 메서드가 있지만이를 만드는 방법이 문제입니다.

저는 지난 4 시간 동안 성공을 거두지 못했습니다.

누군가 나를 도와 줄 수 있습니까?

감사

+0

다른 질문과 비슷합니다. http://stackoverflow.com/questions/4794560/quartz-integration-with-spring/ – Ralph

+0

글쎄요, 작은 차이가 있습니다. 이 함수는 Quartz에 대한 스프링 지원을 사용하고 다른 함수는 지원하지 않는다. 나는 당신의 제안을 썼다. 다른 퀘스트들에 대해 얄프는 해봤지만 로그 파일에는 오류가 없었다. 그래서 저는 Spring의 지원을 사용하기로 전환했습니다. 그러나 이제는이 지원을 보류하고 있습니다. 글쎄 내 접근 방식이 위의 코드에 맞는지 말해 줄 수 있니? 트리거 속성을 설정하는 방법을 알려주는 것이 좋습니다. – cyclecount

답변

-1

가장 큰 문제는 작업 예약 필요,해야한다 :

scheduler.scheduleJob(jobDetail, trigger); 

을 그리고 봄 QUARZ 콩이 얼마나 잘 모르겠지만, 정상 QUARZ 잡스와 트리거해야 이름과 그룹이있다! 그리고 당신은 스케줄러 시작해야 할 수 있습니다 : 코드 나 수정 한이 봄없이 작동하는지 조금 scheduler.start();

을, 어떻게 작동하는지 모두 입증하기 위해, 필요하지 않은 물건을두고 :

패키지 테스트 ;

import java.text.ParseException; 
import java.util.Date; 

import org.quartz.CronTrigger; 
import org.quartz.Job; 
import org.quartz.JobDetail; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerException; 
import org.quartz.SchedulerFactory; 
import org.quartz.impl.StdSchedulerFactory; 


public class Demo { 

    public static class TestJob implements Job{ 
     @Override 
     public void execute(JobExecutionContext arg0) throws JobExecutionException { 
      System.out.println("execute");   
     } 
    } 

    public static void declareWinner() throws SchedulerException, ParseException { 

     JobDetail jobDetail = new JobDetail("job","group",Demo.TestJob.class); 

     CronTrigger trigger = new CronTrigger("trigger","group"); 

     trigger.setStartTime(new Date()); 
     trigger.setEndTime(new Date(new Date().getTime() + 10 * 60 * 1000)); 
     trigger.setCronExpression("* * * * * ? *");  

     /** STEP 4 : INSTANTIATE SCHEDULER FACTORY BEAN AND SET ITS PROPERTIES **/ 
     SchedulerFactory sfb = new StdSchedulerFactory(); 
     Scheduler scheduler = sfb.getScheduler();  

     scheduler.scheduleJob(jobDetail, trigger);  

     scheduler.start();     
    } 

    public static void main (String[] args) throws SchedulerException, Exception { 
     declareWinner(); 
     Thread.sleep(10000); 
    } 

} 
8

스프링 스케줄링 프레임 워크를 사용하여 성공적으로 수행 할 수있었습니다.

이 게시물은 매우 오래된 게시물이지만이 주제에 대한 내용은 매우 부족하므로 여기에 게시하는 것이 좋습니다.

첫 번째 게시물의 코드에서 주요 문제는 이 JobDetail 개체와 CronTrigger 개체 모두에서 호출되지 않았다는 것입니다. afterProperties 함수는 cron을 실행할 준비가되기 전에 입력 된 값에 대해 일부 처리를 수행합니다.

또한 jobDetail 개체 대신 MethodInvokingJobDetailFactoryBean 개체를 사용했습니다. 주어진 클래스의 cron에서 호출 할 수있는 함수에 더 많은 유연성을 제공하기 때문입니다.

package test.spring; 

import org.quartz.JobDetail; 
import org.quartz.Trigger; 
import org.springframework.context.support.GenericApplicationContext; 
import org.springframework.scheduling.SchedulingException; 
import org.springframework.scheduling.quartz.CronTriggerBean; 
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; 
import org.springframework.scheduling.quartz.SchedulerFactoryBean; 

import java.text.ParseException; 

public class ProgrammaticCron { 

    public static void callWorkFlow() { 
     System.out.println("Abhishek Jain"); 
    } 

    public static void main (String[] args) { 
     try { 
      GenericApplicationContext applicationContext = new GenericApplicationContext(); 

      MethodInvokingJobDetailFactoryBean jdfb = new MethodInvokingJobDetailFactoryBean(); 
      jdfb.setTargetClass(ProgrammaticCron.class); 
      jdfb.setTargetMethod("callWorkFlow"); 
      jdfb.setName("Trial program"); 
      jdfb.afterPropertiesSet(); 
      JobDetail jd = (JobDetail)jdfb.getObject(); 

      CronTriggerBean ctb = new CronTriggerBean(); 
      ctb.setJobDetail(jd); 
      ctb.setName("Daily cron"); 
      ctb.setJobName(jd.getName()); 
      try { 
       ctb.setCronExpression("59 * * * * ? *"); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 

      ctb.afterPropertiesSet(); 

      SchedulerFactoryBean sfb = new SchedulerFactoryBean(); 
      sfb.setJobDetails(new JobDetail[]{(JobDetail)jdfb.getObject()}); 
      sfb.setTriggers(new Trigger[]{ctb}); 
      sfb.afterPropertiesSet(); 
      try { 
       sfb.start(); 
      } catch (SchedulingException e) { 
       e.printStackTrace(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

afterProperties()이 중요하며, 다음대로 SchedulerFactoryBeanafterProperties 구현에서 이해 될 수있다 :

//--------------------------------------------------------------------- 
// Implementation of InitializingBean interface 
//--------------------------------------------------------------------- 

public void afterPropertiesSet() throws Exception { 
    if (this.dataSource == null && this.nonTransactionalDataSource != null) { 
     this.dataSource = this.nonTransactionalDataSource; 
    } 

    if (this.applicationContext != null && this.resourceLoader == null) { 
     this.resourceLoader = this.applicationContext; 
    } 

    // Create SchedulerFactory instance. 
    SchedulerFactory schedulerFactory = (SchedulerFactory) 
      BeanUtils.instantiateClass(this.schedulerFactoryClass); 

    initSchedulerFactory(schedulerFactory); 

    if (this.resourceLoader != null) { 
     // Make given ResourceLoader available for SchedulerFactory configuration. 
     configTimeResourceLoaderHolder.set(this.resourceLoader); 
    } 
    if (this.taskExecutor != null) { 
     // Make given TaskExecutor available for SchedulerFactory configuration. 
     configTimeTaskExecutorHolder.set(this.taskExecutor); 
    } 
    if (this.dataSource != null) { 
     // Make given DataSource available for SchedulerFactory configuration. 
     configTimeDataSourceHolder.set(this.dataSource); 
    } 
    if (this.nonTransactionalDataSource != null) { 
     // Make given non-transactional DataSource available for SchedulerFactory configuration. 
     configTimeNonTransactionalDataSourceHolder.set(this.nonTransactionalDataSource); 
    } 


    // Get Scheduler instance from SchedulerFactory. 
    try { 
     this.scheduler = createScheduler(schedulerFactory, this.schedulerName); 
     populateSchedulerContext(); 

     if (!this.jobFactorySet && !(this.scheduler instanceof RemoteScheduler)) { 
      // Use AdaptableJobFactory as default for a local Scheduler, unless when 
      // explicitly given a null value through the "jobFactory" bean property. 
      this.jobFactory = new AdaptableJobFactory(); 
     } 
     if (this.jobFactory != null) { 
      if (this.jobFactory instanceof SchedulerContextAware) { 
       ((SchedulerContextAware) this.jobFactory).setSchedulerContext(this.scheduler.getContext()); 
      } 
      this.scheduler.setJobFactory(this.jobFactory); 
     } 
    } 

    finally { 
     if (this.resourceLoader != null) { 
      configTimeResourceLoaderHolder.remove(); 
     } 
     if (this.taskExecutor != null) { 
      configTimeTaskExecutorHolder.remove(); 
     } 
     if (this.dataSource != null) { 
      configTimeDataSourceHolder.remove(); 
     } 
     if (this.nonTransactionalDataSource != null) { 
      configTimeNonTransactionalDataSourceHolder.remove(); 
     } 
    } 

    registerListeners(); 
    registerJobsAndTriggers(); 
     } 

당신이 알다시피, 이러한 모든 작업을 여기에

내 코드입니다 스케줄러를 가져오고 작업에 트리거를 등록하는 것이이 기능의 일부로 수행됩니다.

관련 문제