版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/yy756127197/article/details/82288846
Springboot 版本的请参考这篇博客Spring boot 自带的Schedule–多实例
shedlock锁的更多使用方式请参考github ShedLock
- 添加pom
- 数据库脚本
- 修改配置文件
测试类
一. 添加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());
}