spring boot @Scheduled未生效原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot @Scheduled未生效原因相关的知识,希望对你有一定的参考价值。

参考技术A 在spring boot中,支持多种定时执行模式(cron, fixRate, fixDelay),在Application或者其他Autoconfig上增加 @EnableScheduling注解开启。

然后在指定方法增加@Scheduled注解,如下:

需要注意的是,如果在多个函数上使用了@Scheduled,那么一定是一个执行完毕,才能排下一个。这往往不是我们想要的效果。此时需要在Scheduling配置类为schedule返回一个预定的线程池,如下:

完成之后,多个@Scheduled可以并发执行了,最高并发度是3,但是同一个@Schedule不会并发执行。

人生没有彩排,每天都是现场直播,开弓没有回头箭,努力在当下。

java Spring Boot @Scheduled + Spring Security @PreAuthorize = RunAs

package io.mikael;

import com.google.common.collect.ImmutableList;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;

public class RunAs {

    @FunctionalInterface
    public interface RunAsMethod {
        default void run() {
            try {
                runWithException();
            } catch (Exception e) {
                // ignore
            }
        }
        void runWithException() throws Exception;
    }

    public static void runAsAdmin(final RunAsMethod func) {
        final AnonymousAuthenticationToken token = new AnonymousAuthenticationToken("system", "system",
                ImmutableList.of(new SimpleGrantedAuthority("ROLE_ADMIN")));
        final Authentication originalAuthentication = SecurityContextHolder.getContext().getAuthentication();
        SecurityContextHolder.getContext().setAuthentication(token);
        func.run();
        SecurityContextHolder.getContext().setAuthentication(originalAuthentication);
    }

}

@Service
class FooService {
    @Inject FooDao dao;
    
    @Scheduled(fixedRate = 600000L, initialDelay = 60000L)
    public void periodicalTask() throws IOException {
        RunAs.runAsAdmin(() -> {
            dao.save(new Foo(...));
        });
    }
}


@RepositoryRestResource(path = "notices")
public interface FooDao extends JpaRepository<Foo, String> {

    @Override
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    <S extends Foo> S save(S entity);
    
}

以上是关于spring boot @Scheduled未生效原因的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot整合@Scheduled定时计划

Spring Boot 每月测试@Scheduled

java Spring Boot @Scheduled + Spring Security @PreAuthorize = RunAs

Spring Boot @Scheduled 定时任务实战

spring boot 学习定时任务 @Scheduled

玩转 Spring Boot 集成篇(@Scheduled静态动态定时任务)