java - Quartz 调度器执行一个 Runnable
问题描述
Quartz Scheduler 可以执行 Runnable 吗?
例如,我有以下代码由 spring 运行TaskScheduler
:
[...]
@Autowired
@Qualifier(IntegrationConfiguration.TASK_SCHEDULER_INTEGRATION_NAME)
private TaskScheduler taskScheduler;
[...]
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(new Runnable() {
@Override
public void run() {
try {
execucaoJobService.executa(jobName, execucaoJobDto, jobScheduleId);
} catch (JobExecutionException e) {
LOG.error("Job Execution fails", e);
}
}
}, new CronTrigger(cronExpression));
[...]
我想用 Quartz 做上面的代码,我知道有 QuartzJobBean 类,但是这个只适用于静态代码,我需要传递 cronExpression 和其他参数动态。
解决方案
You could define a job that takes a Runnable
via the JobDataMap
, and run that on execution.
The job would look like this:
public final class RunnableJob implements Job {
public static final String RUNNABLE_KEY = "RUNNABLE_KEY";
public RunnableJob() {
// Explicit constructor is required by Quartz.
}
@Override
public void execute(JobExecutionContext jobExecutionContext) {
final var runnable = (Runnable) jobExecutionContext.getJobDetail().getJobDataMap().get(RUNNABLE_KEY);
runnable.run();
}
}
Where you schedule your job it would look something like this:
final var cronTrigger = TriggerBuilder.newTrigger()
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
final var jobDetail = JobBuilder.newJob(RunnableJob.class)
.setJobData(new JobDataMap(Map.of(RunnableJob.RUNNABLE_KEY,
(Runnable) () -> {
// Do whatever you want to do
})))
.build();
scheduler.scheduleJob(jobDetail, cronTrigger);
推荐阅读
- ruby-on-rails - 使用 Devise 在 Rails 中划分经过身份验证和未经身份验证的布局
- php - Docusign:沙盒 100% 工作,添加 FORMULATAB 时生产失败
- php - 多个数组值(某些值相同)如何仅获得 2 个相同的值
- amazon-web-services - 在 with_items 循环中迭代 ansible
- c# - 我应该使用 Thread.Sleep() 检查进程是否仍在运行吗?
- c# - 我如何在 xamarin.forms 应用程序中将permissionplugin 与zxing nuget pkg 一起使用?
- powershell - 如何使用 powershell 在 Windows 文件夹中查找第二个最新(访问)文件
- haskell - 如何使用状态单子
- angular - 我怎样才能有一个输入形式的数组?
- python - 如何同时通过循环两次遍历文本文件