Quartz を使用してアプリケーションをスケジュールすることを検討していますが、すべての場合において、ジョブ トリガーは 1 回限りのアクティビティのようであり、トリガーへの変更を有効にするにはアプリケーションを再デプロイする必要があります。
コードを再デプロイせずに、ジョブ トリガーでジョブ スケジュールの変更をチェックする方法はありますか?
ありがとう、
質問する
3289 次
1 に答える
0
- テキスト値の更新など、ユーザー主導のイベントをトラップします。たとえば、ジョブをスケジュールするための cron-string です。
- 古いジョブとトリガーを見つけてスケジュール解除/削除します。
新しいトリガーを使用して、ジョブを再度スケジュールします。
public static <T> T scheduleCronJob(Class<T> clazz, String cronString, String uid){ try{ if(cronString == null){ throw new CronStringConfigurationException(); } String jobGroupName = "cronJobsGroup"; String jobName = "cronJob" + uid; String triggerGroupName = "cronTriggers"; String triggerName = "triggerFor" + uid; JobDetail jobDetail = new JobDetail(jobName, jobGroupName, clazz); CronTrigger trigger = new CronTrigger( triggerName, triggerGroupName, jobName, jobGroupName, cronString); JobDataMap jobDataMap = new JobDataMap(); jobDetail.setJobDataMap(jobDataMap); getScheduler().scheduleJob(jobDetail, trigger); } catch(Exception e){ // print error message, throw stack trace } return null; } public static void reloadCronJob(Class clazz, String cronString, String uid) throws SystemException, ParseException, SchedulerException, CronStringConfigurationException, PortalException{ // locate the job String jobGroupName = "cronJobs"; String jobName = "jobFor" + uid; if(cronString == null){ throw new CronStringConfigurationException(); } JobDetail jobDetail = null; Class<?> jobClass = null; // remove the old job/trigger if it exists try{ jobDetail = scheduler.getJobDetail(jobName, jobGroupName); if(jobDetail != null){ jobClass = jobDetail.getJobClass(); } scheduler.deleteJob(jobName, jobGroupName); } catch(Exception e){ e.printStackTrace(); } if(jobClass == null){ jobClass = clazz; } // create a new trigger scheduleCronJob(jobClass, expandoColumnName, uid); System.out.println("(re)scheduled job " + jobName + " using new cron string " + cronString); }
于 2013-02-01T19:23:54.290 に答える