springboot 使用延迟任务
时间: 2023-11-20 16:57:19 浏览: 108
可以使用SpringBoot的ApplicationRunner接口来实现在Spring容器启动完成后执行延迟任务的功能。具体步骤如下:
1.创建一个延迟任务类,实现Runnable接口,重写run()方法,在该方法中编写需要执行的延迟任务逻辑。
2.创建一个延迟任务队列类,继承DelayQueue类,重写offer()方法,在该方法中将延迟任务添加到队列中。
3.创建一个延迟任务执行类,实现ApplicationRunner接口,重写run()方法,在该方法中启动一个线程,从延迟任务队列中取出延迟任务并执行。
4.在SpringBoot主类中添加@Bean注解,将延迟任务执行类加入到Spring容器中。
下面是一个示例代码,演示了如何在SpringBoot中使用延迟任务:
```java
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.concurrent.DelayQueue;
import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit;
@Component
public class DelayTaskRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
DelayQueue<DelayTask> delayQueue = new DelayQueue<>();
delayQueue.offer(new DelayTask("task1", 5, TimeUnit.SECONDS));
delayQueue.offer(new DelayTask("task2", 10, TimeUnit.SECONDS));
delayQueue.offer(new DelayTask("task3", 15, TimeUnit.SECONDS));
new Thread(() -> {
while (true) {
try {
DelayTask task = delayQueue.take();
System.out.println("执行延迟任务:" + task.getName());
// 执行延迟任务逻辑
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
private static class DelayTask implements Delayed {
private String name;
private long delayTime;
public DelayTask(String name, long delayTime, TimeUnit timeUnit) {
this.name = name;
this.delayTime = System.currentTimeMillis() + timeUnit.toMillis(delayTime);
}
public String getName() {
return name;
}
@Override
public long getDelay(TimeUnit unit) {
return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
}
@Override
public int compareTo(Delayed o) {
return Long.compare(this.delayTime, ((DelayTask) o).delayTime);
}
}
}
```
阅读全文