如何使用Quartz在现有对象上调用方法?

时间:2016-03-24 08:49:01

标签: java quartz-scheduler

我有一个对象,很好地配置了它完成工作所需的一切。如果我每天只能拨打run()一次,我的生命就会完整。

要清楚,我知道如何创建计划和触发器。但是计划所有人的方法需要JobDetail,它想要创建我的类的新实例。我如何使用我拥有的那个?

简而言之,没有Spring可以使用Quartz在我的对象上调用方法吗?

4 个答案:

答案 0 :(得分:1)

如果您使用Quartz with Spring,您可以执行以下操作:

Sample code

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

这里configuredObject是您配置良好的对象,methodName是要调用的方法的名称。您可以将configuredObject自动装配到此类中。

答案 1 :(得分:1)

如果我能正确使用,您可以使用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();

答案 2 :(得分:0)

您可能最好使用内置的java.util.concurrent. ScheduledExecutorService及其scheduleAtFixedRate()方法,而不是使用Quartz。

例如:

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类的静态字段中存储对象的引用。不优雅,但也不完全是世界末日。

答案 3 :(得分:0)

这是一些代码(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)
        }
    }
}
相关问题