我在 micronaut 应用程序中使用 @Scheduled - 注释实现了一些预定的 staks,如下所述:https://guides.micronaut.io/latest/micronaut-scheduled-gradle-java.html
除了所有作业在应用程序启动完成之前执行之外,这工作得很好。这是一个问题,因为我的启动过程包含执行数据库更新作业以及需要在其他所有事情之前完成的事情。
那么如何强制所有计划的作业等待应用程序启动过程完成?
“完成”是指那一刻
[main] INFO io.micronaut.runtime.Micronaut - 启动完成于 9127 毫秒。服务器运行:http://localhost:8080
出现在我的控制台中。
我知道我可以手动安排所有工作,但这意味着要为包含计划任务的所有类实现一个事件侦听器。我不想依赖其他开发人员来记住这一点,对于如此简单的要求来说,这听起来工作量太大了。
使用 Micronaut 4 时最简单的事情就是使用 Micronauts 表达式语言和事件监听器的使用。
鉴于以下作业,我们将使用表达式语言值
#{!this.paused}
来暂停作业,除非布尔标志 paused
设置为 false
。
@Singleton
public class SomeJob {
private boolean paused = true;
@Scheduled(fixedRate = "5m", condition = "#{!this.paused}" )
public void doSomething() {
System.out.println("The job runs...");
}
public boolean isPaused() {
return paused;
}
@EventListener
public void onStartup(StartupEvent event) {
this.paused = false;
}
}
请注意,表达式语言是 Micronaut 4 的一项功能,在以前版本的 Micronaut 中不可用。