java 分布式任务_Java中实现分布式定时任务

Monogo

DynamoDB

JdbcTemplate

ZooKeeper (using Curator)

Redis (using Spring RedisConnectionFactory)

Redis (using Jedis)

Hazelcast

第一步引入依赖

net.javacrumbs.shedlock

shedlock-spring

4.11.1

net.javacrumbs.shedlock

shedlock-provider-jdbc-template

4.11.1

第二步添加配置类

importnet.javacrumbs.shedlock.core.LockProvider;importnet.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.jdbc.core.JdbcTemplate;importjavax.annotation.Resource;importjavax.sql.DataSource;importjava.util.TimeZone;/*** @descrition shedlock配置类

*@since2021-01-10 22:39*/@Configurationpublic classShedLockConfig {

@ResourceprivateDataSource dataSource;/*** @description

* @date 2021/1/10 22:39*/@BeanpublicLockProvider lockProvider() {return newJdbcTemplateLockProvider(

JdbcTemplateLockProvider.Configuration.builder()

.withJdbcTemplate(newJdbcTemplate(dataSource))

.withTimeZone(TimeZone.getTimeZone("GMT+8"))

.build()

);

}

}

第三步,添加公共存储,前面我们说过shedlock支持多种公共存储作为锁,本文我们以mysql为例

CREATE TABLEshedlock (

NAMEVARCHAR ( 64 ) NOT NULL,

lock_untilTIMESTAMP ( 3 ) NOT NULL,

locked_atTIMESTAMP ( 3 ) NOT NULL DEFAULT CURRENT_TIMESTAMP ( 3),

locked_byVARCHAR ( 255 ) NOT NULL,PRIMARY KEY( NAME )

);

第四步,添加具体任务类

importlombok.extern.slf4j.Slf4j;importnet.javacrumbs.shedlock.spring.annotation.SchedulerLock;importorg.springframework.scheduling.annotation.Scheduled;importorg.springframework.stereotype.Component;importjava.text.SimpleDateFormat;importjava.util.Date;/***@authorshane

* @date 2021/1/10 23:39*/@Slf4j

@Componentpublic classTestJob {/*** @description 每隔1min打印一次

* @date 2021/1/10 23:39*/@Scheduled(cron= "0 0/1 * * * ?")//lockAtMostFor为锁默认持有时间,会覆盖启动类中的默认持有时间

@SchedulerLock(name = "demo", lockAtMostFor = "70m")public void print() throwsInterruptedException {

SimpleDateFormat df= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式

log.warn("当前时间:"+df.format(newDate()));

}

}

接着,我们复制一份代码,分别启动两个实例来看结果

c4ffca51eb5360ff3f8288dbf8373482.png

73cd29381f272b7684cbf2500b0e3cf0.png

数据库记录

235d6f712821150a9c84e72e08823173.png

@SchedulerLock注解参数说明

name:定时任务的名字,就是数据库中的内个主键

lockAtMostFor:锁的最大时间单位为毫秒

lockAtLeastFor:锁的最小时间单位为毫秒

对了,还有启动类的配置

@SpringBootApplication

@MapperScan("com.example.test.mapper")

@EnableScheduling

@EnableSchedulerLock(defaultLockAtMostFor= "10m") // 默认的锁的时间public classTestApplication {public static voidmain(String[] args) {

SpringApplication.run(TestApplication.class, args);

}

}

参考出处: https://www.jianshu.com/p/941416645606

shedlock的github地址:https://github.com/lukas-krecan/ShedLock

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值