我已安排Jobs读取“合格间隔”以根据可配置的参数扫描足够旧的数据。建议将“旧”标准作为值和Java 7日历单元。示例:
job1.cron=0 10 6 * * *
job1.eligibleinterval.value=5
job1.eligibleinterval.unit=Calendar.DAY # Job 1's Eligible Data is 5 days old
job2.cron=0 10 6 * * *
job2.eligibleinterval.value=1
job2.eligibleinterval.unit=Calendar.MONTH # Job 2's Eligible Data is 1 month old
理想情况下,受支持的单位应包括Minutes, Hours, Days, Months, Years
(也许不包括Seconds
)。
在代码中,必须按以下方式计算截止日期(这是DAY
版本的硬编码):
// This hard-codes DAYS
LocalDate localDate = LocalDate.now().minusDays(
Long.parseLong(poperties.getProperty("job1.eligibleinterval.value")));
我的问题是,是否有一个好的设计解决方案(也许在Java 8中)减去Java 8中动态提供的时间单位,以避免针对不同单位的If/Else
决策树?是否有比minusDays
,minusMonths
更优雅的解决方案? (顺便说一下,minusMinutes
或minusHours
没有快速的方法。)
答案 0 :(得分:4)
您应该能够使用需要TemporalUnit
的{{3}}重载
:
long amount = Long.parseLong(properties.getProperty("job1.eligibleinterval.value"));
TemporalUnit unit = ChronoUnit.valueOf(properties.getProperty("job1.eligibleinterval.unit"));
LocalDate localDate = LocalDate.now().minus(amount, unit);
此解决方案要求您的配置文件中的时间单位声明为符合LocalDate.minus()
枚举中的常量。