如何用Quartz调用现有对象的方法?

我有一个对象,很好地配置了所有需要做的工作。 如果我可以每天一次地调用run() ,我的生活将会完成。

要清楚,我知道如何创建一个时间表和触发器。 但是所有调度方法都需要JobDetail,它需要创建一个新的类实例。 我如何使用我拥有的那个?

总之,没有一个很好的方式,使用Quartz调用我的对象的方法吗?

如果你在Spring中使用Quartz,你可以这样做:

示例代码

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

这里的configuredObject是你很好配置的对象, methodName是要调用的方法的名字。 您可以将配置的对象自动装入此类。

你可以使用Quartz JobBuilder使用你自己的jobDetails类来建立Quartz JobDetail对象,如果我正确地得到你的话。 让我知道,如果这不是你所要求的。

假设工作信息是你自己的职业有工作细节。 那么你可以像下面这样使用它:

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(); 

而不是使用Quartz,最好使用内置的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); 

如果您需要使用Quartz,则可以始终在Job类的静态字段中存储对象的引用。 不优雅,但不完全是世界的尽头。

这里有一些代码(Kotlin)

 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) } } }