迁移旧的 Quartz 作业名称

问题描述 投票:0回答:1

我有一个旧的 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?

spring-boot quartz-scheduler
1个回答
0
投票

您收到 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");
}
© www.soinside.com 2019 - 2024. All rights reserved.