2016-08-09 12 views
0

Ich rufe einen Scheduler (sollte abhängig von bestimmten Bedingungen) von einem anderen Scheduler (wird alle 1 Stunde ausgeführt). Wenn die Bedingung 'if (diffMinutes> = freq)' erfüllt ist, wird die execute (JobExecutionContext context) -Methode von QSchedule3 Class aufgerufen. Wie übergebe ich den Inhalt der von der QSchedule2-Klasse erhaltenen Datenbank an diese Ausführungsmethode? Kann es gemacht werden? Kann ich einige Vorschläge haben?QuartzScheduler: Übergeben Sie Datenbankwerte von einer Klasse in eine andere

QSchedule1 Klasse

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 Klasse

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 Klasse

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

Antwort

1

Sie können JobExecutionContext verwenden, um Daten an einen Job zu übergeben.

In QSchedule2:

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

In QSchedule3.execute():

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

Ich versuchte JobDataMap und ich bin in der Lage, die Werte in der anderen Klasse zu holen, aber ich bin immer ‚org.quartz.ObjectAlreadyExistsException : Job: 'q3Job.cronJob3' kann nicht gespeichert werden, da mit dieser Kennung bereits eine existiert. ' Error. – user5776462

+0

Ich habe versucht 'if (job3 == null) { \t \t \t \t \t scheduler.scheduleJob (job3, cronTrigger3); \t \t \t \t} else { \t \t \t \t \t scheduler.rescheduleJob (cronTrigger3.getKey(), cronTrigger3); \t \t \t \t} \t \t \t \t scheduler.start(); 'aber die QSchedule3 nicht ausgeführt zu werden. Kannst du sagen warum? – user5776462

Verwandte Themen