2016-08-10 12 views
0

私は石英スケジューラを使用して、さまざまな期間に異なるレポートにエラーメッセージを送信しています。私は2番目のスケジューラ(ここに示すコード)を実行する1時間ごとに実行する1つのスケジューラを作成しました。メッセージを送信する必要がある時間はデータベースから得られ、それはexp変数で渡されます。私はデータベースの最初の行の値だけを取得することができ、また取得していますorg.quartz.ObjectAlreadyExistsException:ジョブを保存することができません: 'q3Job.cronJob3'、これはすでにこの識別情報が存在するためです。 'エラー。このエラーを修正するには?誰も私にこのアプローチに正しい方法を提案することができますスケジューリングのタスクQuartzScheduler:異なる期間に異なるレポートにエラーメッセージを送信

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) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       rs.close(); 
       ps.close(); 
       con.close(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
} 

答えて

0

scheduler APIを見てください。

ジョブは魔法のように削除されません。ジョブが既に分かっているかどうかを確認するには、checkExists()メソッドを使用します。 ジョブが存在する場合、トリガーが適切かどうかを確認できます。そうであれば、何もしないでください。そうでない場合は、トリガを更新します。

関連する問題