配置Jobrunr任务删除策略时,引用application.properties值解析失败求助
Jobrunr自定义删除策略配置解析失败问题解决
问题分析
你在使用@Job注解通过application.properties配置任务成功/失败后的删除时机时,系统提示无法解析值,核心原因有两点:
- 配置文件格式错误:用
--作为注释(application.properties注释需用#),且值末尾多了无效的!符号,不符合ISO-8601时长格式规范 - 注解参数的占位符解析限制:
@Job注解属性虽支持Spring占位符,但需确保配置值为合法的ISO-8601 Duration格式,且Spring能正确解析注解中的占位符
解决步骤
1. 修正application.properties配置格式
将配置中的注释符号改为#,移除值末尾的!,确保时长格式符合ISO-8601规范:
# 成功任务1天后删除 jobrunr.cleanup.succeededJobsDuration=P1D # 失败任务7天后删除 jobrunr.cleanup.failedJobsDuration=P7D
2. 注解占位符解析异常的替代方案
如果修正配置后仍无法解析,可改用编程式配置删除策略,绕过注解的编译时常量限制:
import org.jobrunr.jobs.Job; import org.jobrunr.jobs.filters.JobFilter; import org.jobrunr.scheduling.JobScheduler; import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.core.env.Environment; import javax.sql.DataSource; import java.time.Duration; import java.util.stream.Collectors; @Bean public JobScheduler jobScheduler(DataSource dataSource, ObjectProvider<JobFilter> jobFilters, Environment environment) { return JobRunr.configure() .useDataSource(dataSource) .useJobFilters(jobFilters.orderedStream().collect(Collectors.toList())) .withJobFilter(new JobFilter() { @Override public Job onCreating(Job job) { // 从配置中读取时长并设置任务删除策略 String succeededDuration = environment.getProperty("jobrunr.cleanup.succeededJobsDuration"); String failedDuration = environment.getProperty("jobrunr.cleanup.failedJobsDuration"); job.setDeleteOnSuccess(Duration.parse(succeededDuration)); job.setDeleteOnFailure(Duration.parse(failedDuration)); return job; } }) .initialize() .createJobScheduler(); }
这种方式直接从Spring环境读取配置值,手动设置任务删除策略,适配更复杂的配置场景。
3. 版本适配检查
确保使用的Jobrunr为最新稳定版,旧版本可能存在注解占位符解析的BUG,升级版本可避免此类问题。
内容的提问来源于stack exchange,提问作者Akhil KC
相关产品推荐
相关产品推荐

