我在 Spring Boot 应用程序中使用 jobrunr
5.1.4
。我有一个简单的服务,声明一个允许重试的重复作业。一次失败的作业运行与我无关。相反,我有兴趣在所有作业(即包括所有重试的初始作业)失败后收到通知。
我认为 JobRunr 的
JobServerFilter
是个好主意。但是,只有在作业成功运行的情况下,发生异常时才不会触发 onProcessed()
方法。每次状态变化都会触发 ApplyStateFilter
。对于我的要求来说太频繁了。如果对 FAILED
状态的更改是一系列属于一起的作业中的最后一个(初始作业 + 允许重试作业),这让我一无所知。
一个简单的例子如下:
@Service
public class JobScheduler {
@Job(name = "My Recurring Job", retries = 2, jobFilters = ExceptionFilter.class)
@Recurring(id = "my-recurring-job", cron = "*/10 * * * *")
public void recurringJob() {
throw new RuntimeException("foo");
}
}
我的
JobFilter
的基本实现如下所示:
@Component
public class ExceptionFilter implements JobServerFilter, ApplyStateFilter {
@Override
public void onProcessing(Job job) {
log.info("onProcessing: {}", job.getJobName());
log.info(job.getJobState().getName().name());
}
@Override
public void onProcessed(Job job) {
log.info("onProcessed: {}", job.getJobName());
log.info(job.getJobState().getName().name());
}
@Override
public void onStateApplied(Job job, JobState jobState1, JobState jobState2) {
log.info("onStateApplied: {}", job.getJobName());
log.info("jobState1: {}", jobState1.getName().name());
log.info("jobState2: {}", jobState2.getName().name());
}
}
JobRunr 是否可以实现此用例?或者有人知道如何以不同的方式解决这个问题吗?
提前非常感谢您的支持。
我认为您与来自
onStateApplied
的 ApplyStateFilter
走在正确的轨道上。
您可以使用以下方法:
@Override
public void onStateApplied(Job job, JobState oldState, JobState newState) {
if (isFailed(newState) && maxAmountOfRetriesReached(job)) {
// your logic here
}
}
OnProcessed
未触发,因为您的作业未处理(由于失败)。
JobFilter 是否会被调用来执行特定的作业?我有一个实现 JobServerFilter、ApplyStateFilter 的过滤器,但不会为简单的计划作业和 cron 作业调用它。 我正在与 micronaut 一起使用。 我们需要在 applications.yml 中启用某些功能吗?