2015-10-19 66 views
0

我使用石英與cron來安排2個工作。一個運行在12:00,另一個在14:00,它運行完美。這是我的代碼。通過一個cron作業運行2個零件

@Override 
public void contextInitialized(ServletContextEvent servletContextEvent) { 
    JobDetail job1 = JobBuilder.newJob(FirstInvoiceGeneration.class) 
      .withIdentity("FirstInvoiceGenerationJob", "group1").build();  
    Trigger trigger1 = TriggerBuilder 
      .newTrigger() 
      .withIdentity("FirstInvoiceGenerationTrigger", "group1") 
      .withSchedule(CronScheduleBuilder.cronSchedule("0 0 12 * * ?")).build(); 


    //Simple invoice generation to check which invoice to be generated today   
    JobDetail job2 = JobBuilder.newJob(TodayInvoiceGeneration.class) 
      .withIdentity("TodayInvoiceGenerationJob", "group1").build();  
    Trigger trigger2 = TriggerBuilder 
      .newTrigger() 
      .withIdentity("TodayInvoiceGenerationTrigger", "group1") 
      .withSchedule(CronScheduleBuilder.cronSchedule(0 0 14 * * ?")).build(); 

    //Schedule it 
    Scheduler scheduler; 
     try { 
      scheduler = new StdSchedulerFactory().getScheduler();    
      scheduler.start(); 
      scheduler.scheduleJob(job1, trigger1); 
      scheduler.scheduleJob(job2, trigger2); 

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

我的兩個班運行兩個職位分別是:

public class FirstInvoiceGeneration implements Job {    

       @Override 
       public void execute(JobExecutionContext arg0) 
         throws JobExecutionException { 
        System.out.println("Listener running.");       
       } 
      } 

我的第二份工作第二類是

public class FirstInvoiceGeneration implements Job {    

       @Override 
       public void execute(JobExecutionContext arg0) 
         throws JobExecutionException {  
        System.out.println("Listener running.");       
       } 
      } 

現在這個運行完美,但我想要做的是有1個工作運行這兩個代碼。現在我可以使用這個cron表達式 - >「0 0 12,14 * *?」 這將使工作在下午12點,下午2點(我的猜測:p)運行。但是我想只有一個類在時間爲12點時執行一個代碼,而其他時間在下午2點時執行。那麼有人能告訴我我該怎麼做嗎?

+0

檢索作業數據爲什麼你想要在一個cron行中運行這些數據? (我可以看到使它工作的唯一方法是有一個函數,看看它是什麼時間,並決定調用哪個類,這是可怕的。)有一個正常的方法來做到這一點(兩個cron行),還有奇怪的做法(一個cron行);如果你要問如何實現這種怪異的方式,你還應該說你爲什麼決定不按正常的方式去做。 – Amadan

+0

你可以通過命令行參數傳遞給你的應用程序來說哪一段代碼? –

+0

其實我必須運行兩個大的查詢,將運行2-3小時,所以先生說,也許這兩個工作可能會相互碰撞。他說可能不是線程安全的。是嗎?我對石英和這一切都非常陌生。所以他說最好在一份工作中做到安全。 –

回答

1

Reference。正如你所看到的,你可以通過usingJobData()方法將數據發送給工作,例如, ("WORK","FIRST"),("WORK","SECOND")

在一個工作職位只檢查WORK密鑰,並相應地做你想做的操作。 JobExecutionContext您可以使用context.getJobDetails().getJobDataMap()

+0

@Emz感謝您的編輯建議。 –

+0

謝謝你,就是我想要的:) –