You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 19:25:30