Spring定时任务 @Scheduled注解(多实例支持)

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/yy756127197/article/details/82288846

Springboot 版本的请参考这篇博客Spring boot 自带的Schedule–多实例
shedlock锁的更多使用方式请参考github ShedLock

  1. 添加pom
  2. 数据库脚本
  3. 修改配置文件
  4. 测试类

    一. 添加pom

    因为要使用多实例调度,所以我是用了分布式锁shedlock,Spring pom请自行添加

<!-- shedlock -->
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-spring</artifactId>
</dependency>
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc-template</artifactId>
</dependency>
<dependency>
    <groupId>net.javacrumbs.shedlock</groupId>
    <artifactId>shedlock-provider-jdbc</artifactId>
</dependency>

二. 数据库脚本

创建shedlock表,shedlock用

CREATE TABLE shedlock(
    name VARCHAR(64), 
    lock_until TIMESTAMP(3) NULL, 
    locked_at TIMESTAMP(3) NULL, 
    locked_by  VARCHAR(255), 
    PRIMARY KEY (name)
) 

三. 修改配置文件

这里写图片描述
如图,在xml中添加途中4行

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd
xmlns:task="http://www.springframework.org/schema/task

<task:annotation-driven/>

并添加如下配置(shedlock)

<!-- lock provider of your choice (jdbc/zookeeper/mongo/whatever) -->
<bean id="lockProvider" class="net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider">
    <constructor-arg ref="dataSource"/>
</bean>

<bean id="scheduler" class="net.javacrumbs.shedlock.spring.SpringLockableTaskSchedulerFactoryBean">
    <constructor-arg>
        <task:scheduler id="sch" pool-size="10"/>
    </constructor-arg>
    <constructor-arg ref="lockProvider"/>
    <constructor-arg name="defaultLockAtMostFor">
        <bean class="java.time.Duration" factory-method="ofMinutes">
            <constructor-arg value="10"/>
        </bean>
    </constructor-arg>
</bean>

四. 测试类

import net.javacrumbs.shedlock.core.SchedulerLock;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;


@Service
@EnableScheduling
public class ScheduleController {
    private final static Logger logger = LoggerFactory.getLogger(ScheduleController.class);
    private static final long FOURTEEN_MIN = 4 * 1000;

    @Scheduled(cron = "0/5 * * * * ?")
    @SchedulerLock(name = "eoaCall", lockAtLeastFor = FOURTEEN_MIN, lockAtMostFor = FOURTEEN_MIN)
    public void schdule() {
        logger.info("============== start ================"+new Date());
    }

猜你喜欢

转载自blog.csdn.net/yy756127197/article/details/82288846
今日推荐