我有一个对象,很好地配置了它完成工作所需的一切。如果我每天只能拨打run()
一次,我的生命就会完整。
要清楚,我知道如何创建计划和触发器。但是计划所有人的方法需要JobDetail,它想要创建我的类的新实例。我如何使用我拥有的那个?
简而言之,没有Spring可以使用Quartz在我的对象上调用方法吗?
答案 0 :(得分:1)
如果您使用Quartz with Spring,您可以执行以下操作:
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)
}
}
}