我有一个旧的 Quartz 作业,我想将其迁移到新版本:
@Component
public class SystemProcessJob implements Job {
......
@Override
protected void execute(JobExecutionContext context) throws JobExecutionException
{
final JobKey key = context.getJobDetail().getKey();
final UUID runId = UUID.fromString(key.getName());
executeInternalProcess(runId);
logger.info("Job Executed");
}
当我运行它时,出现错误:
java.lang.IllegalArgumentException: Invalid UUID string: jobDetail
迁移此代码的正确方法应该是什么?我需要生成手册
UUID runId
或获取作业中的 UUID?
您收到 IllegalArgumentException 因为 UUID.fromString 希望您提供一个真实的 UUID,该 UUID 应该类似于“24b7cc4e-a3ba-4ee7-b0e3-1ccdda09ec30”32 位十六进制数check,它正在将“jobDetail”作为 UUID 并抛出异常。
不了解项目的完整背景。如果您想在 Quartz 中使用 UUID 作为作业标识符,则应确保在创建作业时将作业名称设置为有效的 UUID 字符串。以下是如何执行此操作的示例:
@SpringBootApplication
public class QuartzDemoApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzDemoApplication.class, args);
onStartup();
}
private static void onStartup() throws SchedulerException {
JobDetail job = JobBuilder.newJob(SystemProcessJob.class)
.withIdentity(UUID.randomUUID().toString(), "group1") // set job name to a valid UUID
.build();
Date afterFiveSeconds = Date.from(LocalDateTime.now().plusSeconds(5)
.atZone(ZoneId.systemDefault()).toInstant());
Trigger trigger = TriggerBuilder.newTrigger()
.startAt(afterFiveSeconds)
.build();
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
scheduler.scheduleJob(job, trigger);
}
}
现在下面的方法将带来你想要的UUID
@Override
protected void execute(JobExecutionContext context) throws JobExecutionException
{
final JobKey key = context.getJobDetail().getKey();
final UUID runId = UUID.fromString(key.getName());
executeInternalProcess(runId);
logger.info("Job Executed");
}
我不知道UUID如何在
executeInternalProcess
中使用,我个人只会使用UUID.randomUUID()
而不是UUID.fromString
,这会降低复杂性,如果你没有看到任何问题,你不需要创建它作业开始时使用随机 UUID。
@Override
protected void execute(JobExecutionContext context) throws JobExecutionException
{
final UUID runId = UUID.randomUUID();
executeInternalProcess(runId);
logger.info("Job Executed");
}