2016-03-24 2 views
0

У меня есть объект, прекрасно настроенный со всем, что нужно для выполнения своей работы. Если бы я мог просто позвонить run() на нем один раз в день, моя жизнь была бы полной.Как вызвать метод для существующего объекта с помощью Quartz?

Чтобы быть ясным, я знаю, как создать расписание и триггер. Но методы для планирования всех принимают JobDetail, который хочет создать новый экземпляр моего класса. Как я могу использовать тот, который у меня есть?

Короче говоря, есть ли хороший способ без весны, чтобы вызвать метод на моем объекте с помощью кварца?

+1

Я не знаю, если вы используете какой-то базы для запуска объекта и запланированных заданий Quartz, как весна. Предположим, что вы этого не сделали. Как насчет использования шаблона Singleton для восстановления экземпляра вашего объекта? – RubioRic

+0

Весна имеет методInvokingJobDetailFactoryBean. Другим вариантом может быть создание класса заданий, которые берут ваш объект (из данных задания или что-то еще) и вызывают его. – BobTheBuilder

+0

Если вы используете Spring, здесь есть много возможных решений. Http://stackoverflow.com/questions/6990767/inject-bean-reference-into-a-quartz-job-in-spring – RubioRic

ответ

1

Если вы используете Quartz с весны вы можете сделать следующее:

Sample code

MethodInvokingJobDetailFactoryBean jobDetailfactory = new MethodInvokingJobDetailFactoryBean(); 
jobDetailfactory.setTargetObject(configuredObject); 
jobDetailfactory.setTargetMethod("methodName"); 

Здесь configuredObject ваш хорошо настроен объект и methodName это имя метода, который будет вызван. Вы можете autwire configureObject в этот класс.

+1

Но OP не хочет чтобы получить новый экземпляр своего объекта/помощника – RubioRic

+0

Привет, спасибо, обновил ответ. – M4ver1k

+0

Ах, извините, не хочу тянуть во все (или TBH любой) весны. –

1

Вы можете использовать Quartz JobBuilder для создания Quartz JobDetail Object, используя свой собственный класс JobDetails, если я получу вас правильно. сообщите мне, если это вам не требуется.

Предположим, что информация о работе - это ваш собственный класс, имеющий заданные данные. то вы можете использовать его ниже:

JobDataMap jobDataMap = new JobDataMap();

Map<String, Object> jobParams = jobInfo.getJobParams(); 
for (String paramKey : jobParams.keySet()) { 
    jobDataMap.put(paramKey, jobParams.get(paramKey)); 
} 

jobBuilder.ofType((Class<? extends Job>) Class.forName(jobInfo.getJobClass())) 
    .withIdentity(jobInfo.getName(), jobInfo.getGroup()) 
    .withDescription(jobInfo.getDescription()).storeDurably(jobInfo.isStoreDurably()) 
    .usingJobData(jobDataMap); 

JobDetail jobDetail = jobBuilder.build(); 
0

Вместо того, чтобы использовать кварц, вы могли бы быть лучше, используя встроенный в java.util.concurrent.ScheduledExecutorService и его метод scheduleAtFixedRate().

Например:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1, 
     new ThreadFactory() { 

      @Override 
      public Thread newThread(Runnable runnable) { 
       Thread t = Executors.defaultThreadFactory().newThread(runnable); 
       t.setDaemon(true); 
       return t; 
      } 
     }); 


scheduler.scheduleAtFixedRate(new Runnable() { 

     @Override 
     public void run() { 
      myLovelyObject.run(); 
     } 
    }, 0, 24, TimeUnit.HOURS); 

Если вам нужно использовать кварц, вы всегда можете сохранить ссылку на ваш объект в статическом поле в классе заданий. Не изящный, но не совсем конец света.

+0

Это синтаксический анализ cron, который мне нужен! –

+0

Взгляните на ['org.quartz.CronExpression'] (https://github.com/quartz-scheduler/quartz/blob/master/quartz-core/src/main/java/org/quartz/CronExpression.java). Синтаксический анализ cron полностью автономен. Вы даже можете просто скопировать этот класс в свой проект. –

0

Вот код (Котлин)

fun createJobDetail(jobName: String, function:() -> Unit) = JobBuilder.newJob(MyJob::class.java) 
    .withIdentity(jobName) 
    .usingJobData(JobDataMap(mapOf(jobDataKey to function))) 
    .build()` 

@DisallowConcurrentExecution 
class MyJob : Job { 
    @Suppress("UNCHECKED_CAST") 
    override fun execute(context: JobExecutionContext) { 
     try { 
      (context.jobDetail.jobDataMap[jobDataKey] as() -> Unit)() 
     } catch(e: Exception) { 
      throw JobExecutionException(e) 
     } 
    } 
} 
Смежные вопросы