Scheduled java.lang.IllegalArgumentException: lockAtMostUntil is before lockAtLeastUntil for lock

java.lang.IllegalArgumentException: lockAtMostUntil is before lockAtLeastUntil for lock ‘XXX’. 错误

2021-11-24 11:14:06.010  ERROR o.s.s.s.TaskUtils$LoggingErrorHandler - Unexpected error occurred in scheduled task.
java.lang.IllegalArgumentException: lockAtMostUntil is before lockAtLeastUntil for lock 'testMisc'.
	at net.javacrumbs.shedlock.core.LockConfiguration.<init>(LockConfiguration.java:46)
	at net.javacrumbs.shedlock.spring.internal.SpringLockConfigurationExtractor.getLockConfiguration(SpringLockConfigurationExtractor.java:79)
	at net.javacrumbs.shedlock.spring.internal.SpringLockConfigurationExtractor.getLockConfiguration(SpringLockConfigurationExtractor.java:68)
	at net.javacrumbs.shedlock.spring.internal.SpringLockConfigurationExtractor.getLockConfiguration(SpringLockConfigurationExtractor.java:58)
	at net.javacrumbs.shedlock.core.DefaultLockManager.executeWithLock(DefaultLockManager.java:46)
	at net.javacrumbs.shedlock.core.LockableRunnable.run(LockableRunnable.java:35)
	at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)
	at org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:93)
	at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
	at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)
 /**
     * @params
     * @Description
     * name 不要和其它的定时任务的name重复   是唯一标识  用类名就可以
     * lockAtLeastForString 的作用是为了防止在任务开始之初由于各个服务器同名任务的服务器时间差,启动时间差等这些造成的一些问题,有了这个时间设置后,
     * 就可以避免因为上面这些小的时间差造成的一些意外,保证一个线程在抢到锁后,即便很快执行完,也不要立即释放,留下一个缓冲时间。
     * 这样等多个线程都启动后,由于任务已经被锁定,其他没有获得锁的任务也不会再去抢锁。注意这里的时间不要设置几秒几分钟,尽量大些
     * lockAtMostForString 这个设置的作用是为了防止抢到锁的那个线程,因为一些意外死掉了,而锁又始终不被释放。
     * 这样的话,虽然当前执行周期虽然失败了,但以后的执行周期如果这里一直不释放的话,后面就永远执行不到了。
     * 它的目的不在于隐藏任务,更重要的是,释放锁,并且查找解决问题。
     *
     * 带有string后缀的是 ISO8601 Duration格式 的时间格式  P为开始  T为年月日和时分秒的区分
     * 1Y - 一年
     * 1W - 一周
     * 2M - 两个月
     * 10D - 十天
     * 2H - 两个小时
     * 30M - 三十分钟
     * 15S 十五秒钟
     * 举例 :   P1DT1M - 一天一分钟
     *          P1W - 一周
     *          PT1H - 一小时
     *          PT10S - 十秒
     *
     * 也可以用lockAtLeastFor  和 lockAtMostFor   单位是 毫秒 和String类型的同理
     *
     * 注意!!!!!!!!
     *          lockAtMostFor 的数值 要大于等于 lockAtLeastFor
     * @Author Hc
     * @CreateUser: Hc
     * @CreateDate 2021/11/24 11:03
     * @Version 1.0
     * @Return
     **/
    @Scheduled(cron = "0/3 * * * * ? ")
//    @SchedulerLock(name = "scheduledController_notice",lockAtLeastForString = "PT2S", lockAtMostForString = "PT2S")
    @SchedulerLock(name = "testMisc",lockAtLeastFor = 9*1000, lockAtMostFor = 6*1000)
    public void testMisc(){
        log.info ( "定时任务测试" );
        eleOrderlyChargingFeign.runMisc();
    }
lockAtMostFor或者lockAtMostForString 的数值 要大于等于 lockAtLeastFor或lockAtLeastForString 否则就会报错  

改为

@SchedulerLock(name = "testMisc",lockAtLeastFor = 4*1000, lockAtMostFor = 6*1000)

即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值