Spring Boot 在两个批处理作业之间放置一些延迟

pkln4tw6  于 2023-08-04  发布在  Spring
关注(0)|答案(1)|浏览(107)

我创建了两个批处理作业,这两个作业的初始延迟都是20秒。现在我想在这两个工作之间放一些延迟。如果Job1正在运行,则Job2必须等待几秒钟,然后仅在Job1完成后执行。同样,如果Job2正在运行,则Job1必须等待几秒钟,然后仅在Job2完成后执行。

@Component
public class Job1{

    @Scheduled(fixedRate = 20000)
    public void execute() {
        //business logic
    }
}

@Component
public class Job2{

    @Scheduled(fixedRate = 20000)
    public void execute() {
        //business logic
    }
}

字符串

bxpogfeg

bxpogfeg1#

你可以通过让作业在一个同步方法中运行来实现这种行为,例如,通过引入一个类,这个类有一个方法来执行一个同步方法,即

@Component
class SingleThreadJobRunner {
    synchronized void run(Runnable runnable) {
        runnable.run();
    }
}

字符串
一个完整的工作示例,它在不同的@Scheduled-methods中使用这个类:

@EnableScheduling
@SpringBootApplication
public class Test {
    public static void main(String[] args) {
        SpringApplication.run(Test.class, args);
    }
}

@Component
class SingleThreadJobRunner {
    synchronized void run(Runnable runnable) {
        runnable.run();
    }
}

@Component
@RequiredArgsConstructor
class Job1 {
    private final SingleThreadJobRunner singleThreadJobRunner;

    @Scheduled(fixedRate = 1000)
    public void execute() {
        singleThreadJobRunner.run(() -> {
            System.out.print("job 1 started - ");
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("job 1 completed");

        });
    }
}

@Component
@RequiredArgsConstructor
class Job2 {
    private final SingleThreadJobRunner singleThreadJobRunner;

    @Scheduled(fixedRate = 1500)
    public void execute() {
        singleThreadJobRunner.run(() -> {
            System.out.print("job 2 started - ");
            try {
                Thread.sleep(300);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println("job 2 completed");
        });
    }
}


不同的速率和睡眠时间被用来表明工作从来没有重叠。如果你需要你在问题中提到的方法之间的延迟,这可以添加到run()-方法中。

相关问题