如何在spring框架中使用动态调度程序?

时间:2017-07-05 11:46:09

标签: spring cron taskscheduler spring-scheduled

我正在使用Spring Security 4.2。我想在3次登录失败后阻止用户15分钟。要阻止用户,请将用户status更改为BLOCK。我希望在15分钟后将其返回ACTIVE

我需要一个在15分钟后运行的动态任务调度程序,并更改用户status

重要提示:我不想每15分钟运行一次方法,我想在15分钟后运行方法如果需要

如何实施?

2 个答案:

答案 0 :(得分:1)

我有一些方法。我想您应该使用User类,如下所示:

class User {
    // ...
    private Status status;
    private LocalDateTime lastUpdated;
    // ...
}

因此,您应该在用户阻止期间更新statuslastUpdated字段。

@Service
public class UserService {

    private UserRepository userRepository;

    @Transactional
    public void block(User user) {
        user.setStatus(Status.BLOCKED);
        user.setLastUpdated(LocalDateTime.now());
        userRepository.save(user);
    }
}

之后,您可以使用每分钟运行一次的Spring Scheduler,找到15分钟前被阻止的用户,并将status设置为ACTIVE

@Component
public class UserActivator {

    private boolean activateUsers = false;

    @Scheduled("0 * * * * *")
    public void activateUsers() {
        if (activateUsers) {
            // find users that were deactivated 15 minutes ago and change status to active
        }
    }
}

不要忘记将@EnableScheduling添加到Spring配置中。

答案 1 :(得分:0)

你可能有表格定义这样做。但这就是我一般的做法。

创建一个单独的表来维护失败计数。

然后在此基础上,您可以检查您的服务/控制器层。

SELECT A,B FROM myTable WHERE C='f' GROUP BY A,B

创建一个单独的预定作业来检查和更新用户状态并重置UserLoginFailure计数。

    @Controller
    public Class LoginController{

        @Autowired
        private UserLoginFailureRepository userLoginFailureRepository;

        @Autowired
        private UserRepostory userRepository;

        @Transactional
        public void login(){

        UserLoginFailure loginFailure = userLoginFailureRepository.getUserLoginfailureDetails(username);
        if (loginFailure != null) {
        loginFailure.setFailureCount(1l + loginFailure.getFailureCount());

        if (loginFailure.getFailureCount() > loginFailureCount) {
        // block the user.
        User user = userRepository.getUser(username);
        user.setStatus(BLOCK);
        user.setModificationDate(LocalDateTime.now());
        }
    }
    }
    }