Jobrunr 5.1.6集成Micronaut:自定义ApplyStateFilter不触发及注入问题
在Micronaut中为Jobrunr注入全局状态过滤器
要让你的JobCompletionFilter生效,需要完成两个关键步骤:把过滤器注册为Micronaut Bean,并将其添加到Jobrunr的配置中。
1. 将过滤器标记为Micronaut单例Bean
在你的JobCompletionFilter类上添加@Singleton注解,让Micronaut自动管理这个实例:
import io.micronaut.context.annotation.Singleton import jobrunr.jobs.Job import jobrunr.jobs.states.JobState import jobrunr.jobs.states.SucceededState import jobrunr.filters.ApplyStateFilter @Singleton class JobCompletionFilter : ApplyStateFilter { override fun onStateApplied(job: Job?, oldState: JobState?, newState: JobState?) { if (newState != null) { if (isFailed(newState) && maxAmountOfRetriesReached(job)) { // 重试失败后的日志和处理逻辑 } else if (newState is SucceededState) { // 任务成功后的完成逻辑 } } } private fun isFailed(state: JobState): Boolean { return state is jobrunr.jobs.states.FailedState } private fun maxAmountOfRetriesReached(job: Job?): Boolean { val maxRetries = job?.jobDetails?.retries ?: 0 return (job?.amountOfRetries ?: 0) >= maxRetries } }
2. 在Jobrunr配置中添加过滤器
创建一个Micronaut工厂类,配置JobScheduler时手动注入并添加过滤器:
import io.micronaut.context.annotation.Bean import io.micronaut.context.annotation.Factory import jobrunr.configuration.JobRunr import jobrunr.scheduling.JobScheduler import javax.inject.Singleton @Factory class JobrunrConfiguration { @Bean @Singleton fun jobScheduler(jobCompletionFilter: JobCompletionFilter): JobScheduler { return JobRunr.configure() // 配置你的存储提供者(如JDBC、Redis) .useStorageProvider(/* 替换为你的存储配置,例如:useJdbcStorage(dataSource) */) // 配置Micronaut的依赖注入激活器(如果任务需要注入Micronaut Bean) .useJobActivator { className -> io.micronaut.context.ApplicationContext.run().getBean(Class.forName(className)) } // 添加你的全局状态过滤器 .addFilter(jobCompletionFilter) .initialize() .jobScheduler } }
额外注意事项
- 确保Jobrunr的Worker已经启动:如果使用官方starter,通常会自动启动;如果手动配置,需要调用
jobScheduler.start()来启动Worker进程。 - 验证存储配置:Jobrunr依赖存储跟踪任务状态,错误的存储配置会导致任务无法被处理,过滤器自然不会触发。
内容的提问来源于stack exchange,提问作者srilesnar
相关产品推荐
相关产品推荐

