2016-08-09 14 views
0

私は別のスケジューラー(1時間ごとに実行)からスケジューラー(特定の条件に応じて実行する必要があります)を呼び出しています。 'if(diffMinutes> = freq)'の条件が成立すると、QSchedule3クラスのexecute(JobExecutionContextコンテキスト)メソッドが呼び出されます。 QSchedule2クラスから取得したデータベースの内容をそのメソッドに渡すには?それはできますか?いくつかの提案がありますか?QuartzScheduler:あるクラスから別のクラスにデータベース値を渡す

QSchedule1クラス

public class QSchedule1 { 
    public static void main(String[] args) throws SchedulerException { 

     Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

     JobDetail job = newJob(Q2.class).withIdentity("cronJob", "q2Job").build(); 

     CronTrigger cronTrigger = newTrigger().withIdentity("trigger1", "q2Job") 
       .withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *")).build(); 

     scheduler.scheduleJob(job, cronTrigger); 
     scheduler.start(); 
    } 
} 

QSchedule2クラス

public class QSchedule2 implements Job { 

    private static Date date1 = null; 
    private static Date date2 = null; 

    private static String dateStart = ""; 
    private static String dateStop = ""; 

    public void execute(JobExecutionContext context) throws JobExecutionException { 
     q2(); 
    } 

    public void q2() { 
     String exp = ""; 
     try { 
      Class.forName(driverClassName); 
      con = DriverManager.getConnection(url, dbUsername, dbPassword); 

      dateStop = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(System.currentTimeMillis()); 

      ps = con.prepareStatement(
        "select report_name,frequency,emailDate from ErrorReport where sendReport='Yes'"); 
      rs = ps.executeQuery(); 

      while (rs.next()) { 

       dateStart = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(rs.getTimestamp(3)); 

       SimpleDateFormat format = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 

       date1 = format.parse(dateStart); 
       date2 = format.parse(dateStop); 

       long diff = date2.getTime() - date1.getTime(); 

       long diffMinutes = diff/(60 * 1000) % 60; 

       String frequency = rs.getString(2); 
       int freq = Integer.parseInt(frequency); 

       if (diffMinutes >= freq) { 
        exp = "0 0/" + freq + " * 1/1 * ? *"; 

        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 

        JobDetail job = newJob(Q3.class).withIdentity("cronJob", "q3Job").build(); 

        CronTrigger cronTrigger = newTrigger().withIdentity("trigger1", "q3Job") 
          .withSchedule(CronScheduleBuilder.cronSchedule(exp)).build(); 

        scheduler.scheduleJob(job, cronTrigger); 
        scheduler.start(); 
       } else { 
        System.err.println("No email sent"); 
       } 

      } 

     } catch (Exception e) { 
      System.out.println(e); 
      e.printStackTrace(); 
     } finally { 
      try { 
       rs.close(); 
       ps.close(); 
       con.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

QSchedule3クラス

public class QSchedule3 implements Job{ 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
     //Get database contents here 
    } 
} 

答えて

1

JobExecutionContextを使用して、ジョブにデータを渡すことができます。 QSchedule2

QSchedule3.execute()
JobDetail job = newJob(QSchedule2.class).withIdentity("cronJob", "q2Job") 
      .usingJobData("name", name) 
      .usingJobData("frequency", frequency) 
      .usingJobData("date", date) 
      .build(); 

JobDataMap dataMap = context.getJobDetail().getJobDataMap(); 
String name = dataMap.getString("name"); 
String frequency = dataMap.getString("frequency"); 
String date= dataMap.getString("date"); 
+0

私はJobDataMapを試してみましたが、私は他のクラスに値をフェッチすることができるよ私は「org.quartz.ObjectAlreadyExistsExceptionを取得しています:ジョブを保存することができません: 'q3Job.cronJob3'、これはすでにこのIDが存在するためです。 'エラー。 – user5776462

+0

私は 'if(job3 == null){ \t \t \t \t \t scheduler.scheduleJob(job3、cronTrigger3);を試みました。他 \t \t \t \t} { \t \t \t \t \t scheduler.rescheduleJob(cronTrigger3.getKey()、cronTrigger3)。 \t \t \t \t} \t \t \t \t scheduler.start(); 'しかしQSchedule3が実行取得されていません。理由を教えてください。 – user5776462

関連する問題