- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章SpringBoot 集成 ShedLock 分布式锁的示例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
ShedLock是一个在分布式环境中使用的定时任务框架,用于解决在分布式环境中的多个实例的相同定时任务在同一时间点重复执行的问题。ShedLock确保计划的任务最多同时执行一次。如果一个任务正在一个节点上执行,它会获得一个锁,该锁将阻止从另一个节点(或线程)执行同一任务。请注意,如果一个任务已经在一个节点上执行,则在其他节点上的执行不会等待,只是将其跳过。。简单来说,ShedLock本身只做一件事情:保证一个任务最多同时执行一次。所以如官网所说的,ShedLock不是一个分布式调度器,只是一个锁.
注意:ShedLock支持Mongo,Redis,Hazelcast,ZooKeeper以及任何带有JDBC驱动程序的东西。本例子使用的是基于Redis的方式。之所以不适用基于jdbc存储的主要原因是考虑到大量数据下的数据库压力的原因,若本身基于jdbc等,可直接参考官网给出的提示:
创建对应的表结构.
1
2
3
4
5
6
7
|
CREATE
TABLE
shedlock(
name
VARCHAR
(64),
lock_until
TIMESTAMP
(3)
NULL
,
locked_at
TIMESTAMP
(3)
NULL
,
locked_by
VARCHAR
(255),
PRIMARY
KEY
(
name
)
)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-spring</artifactId>
<version>
2.3
.
0
</version>
</dependency>
<dependency>
<groupId>net.javacrumbs.shedlock</groupId>
<artifactId>shedlock-provider-redis-spring</artifactId>
<version>
2.3
.
0
</version>
</dependency>
<!--spring2.
0
集成redis所需common-pool2 -->
<!-- 必须加上,jedis依赖此 若项目中已经引入jedis 请忽略此步骤-->
<!-- spring boot
2.0
的操作手册有标注 大家可以去看看 地址是:https:
//docs.spring.io/spring-boot/docs/2.0.3.RELEASE/reference/htmlsingle/ -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
|
添加jedis 依赖 若项目中已经引入jedis 请忽略此步骤 。
1
2
3
4
5
6
|
<!--spring2.
0
集成redis所需common-pool2 -->
<!-- 必须加上,jedis依赖此 若项目中已经引入jedis 请忽略此步骤-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
|
配置 lockProvider 并且开启 @EnableSchedulerLock 标签 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
import
net.javacrumbs.shedlock.core.LockProvider;
import
net.javacrumbs.shedlock.provider.redis.spring.RedisLockProvider;
import
net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock;
import
org.springframework.beans.factory.annotation.Value;
import
org.springframework.context.annotation.Bean;
import
org.springframework.context.annotation.Configuration;
import
org.springframework.data.redis.connection.RedisConnectionFactory;
/**
* @Description SchedulerLock 基于 Redis 的配置
* @Author
* @Date 2020/2/22 18:27
**/
@Configuration
//defaultLockAtMostFor 指定在执行节点结束时应保留锁的默认时间使用ISO8601 Duration格式
//作用就是在被加锁的节点挂了时,无法释放锁,造成其他节点无法进行下一任务
//这里默认55s
//关于ISO8601 Duration格式用的不到,具体可上网查询下相关资料,应该就是一套规范,规定一些时间表达方式
@EnableSchedulerLock
(defaultLockAtMostFor =
"PT55S"
)
public
class
ShedLockRedisConfig {
@Value
(
"${spring.profiles.active}"
)
private
String env;
@Bean
public
LockProvider lockProvider(RedisConnectionFactory connectionFactory) {
//环境变量 -需要区分不同环境避免冲突,如dev环境和test环境,两者都部署时,只有一个实例进行,此时会造成相关环境未启动情况
return
new
RedisLockProvider(connectionFactory, env);
}
}
|
注意,要在启动类上添加 @EnableScheduling ,表明开启定时器服务。若不加定时器是不会起效的.
1
2
3
4
5
6
7
8
|
@SpringBootApplication
@EnableScheduling
public
class
EpidemicMessageApplication {
public
static
void
main(String[] args) {
SpringApplication.run(EpidemicMessageApplication.
class
, args);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
//区分服务
@Value
(
"${server.port}"
)
private
String port;
@Scheduled
(cron =
"0 */1 * * * ?"
)
/**
* lockAtLeastForString的作用是为了防止在任务开始之初由于各个服务器同名任务的服务器时间差,启动时间差等这些造成的一些问题,有了这个时间设置后,
* 就可以避免因为上面这些小的时间差造成的一些意外,保证一个线程在抢到锁后,即便很快执行完,也不要立即释放,留下一个缓冲时间。
* 这样等多个线程都启动后,由于任务已经被锁定,其他没有获得锁的任务也不会再去抢锁。注意这里的时间不要设置几秒几分钟,尽量大些
*lockAtMostForString 这个设置的作用是为了防止抢到锁的那个线程,因为一些意外死掉了,而锁又始终不被释放。
* 这样的话,虽然当前执行周期虽然失败了,但以后的执行周期如果这里一直不释放的话,后面就永远执行不到了。
* 它的目的不在于隐藏任务,更重要的是,释放锁,并且查找解决问题。
*至于是否带有string后缀,只是2种表达方式,数字类型的就是毫秒数,字符串类型的就有自己固定的格式 ,例如:PT30S 30s时间设置,单位可以是S,M,H
*/
@SchedulerLock
(name =
"scheduledController_notice"
, lockAtLeastForString =
"PT15M"
, lockAtMostForString =
"PT14M"
)
public
StandardResult notice() {
try
{
logger.info(port +
"- 执行定时器 scheduledController_notice"
);
return
StandardResult.ok();
}
catch
(Exception e) {
logger.error(
"异常信息:"
, e);
return
StandardResult.faild(
"异常信息"
, e);
}
}
|
SchedulerLock注解说明 @SchedulerLock注解一共支持五个参数,分别是 。
name:用来标注一个定时服务的名字,被用于写入数据库作为区分不同服务的标识,如果有多个同名定时任务则同一时间点只有一个执行成功 lockAtMostFor:成功执行任务的节点所能拥有独占锁的最长时间,单位是毫秒ms lockAtMostForString:成功执行任务的节点所能拥有的独占锁的最长时间的字符串表达,例如“PT14M”表示为14分钟,单位可以是S,M,H lockAtLeastFor:成功执行任务的节点所能拥有独占所的最短时间,单位是毫秒ms lockAtLeastForString:成功执行任务的节点所能拥有的独占锁的最短时间的字符串表达,例如“PT14M”表示为14分钟,单位可以是S,M,H 。
到此这篇关于SpringBoot 集成 ShedLock 分布式锁的文章就介绍到这了,更多相关SpringBoot 分布式锁ShedLock内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/weixin_35688430/article/details/119778849 。
最后此篇关于SpringBoot 集成 ShedLock 分布式锁的示例详解的文章就讲到这里了,如果你想了解更多关于SpringBoot 集成 ShedLock 分布式锁的示例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
全称“Java Virtual Machine statistics monitoring tool”(statistics 统计;monitoring 监控;tool 工具) 用于监控虚拟机的各种运
主要是讲下Mongodb的索引的查看、创建、删除、类型说明,还有就是Explain执行计划的解释说明。 可以转载,但请注明出处。  
1>单线程或者单进程 相当于短链接,当accept之后,就开始数据的接收和数据的发送,不接受新的连接,即一个server,一个client 不存在并发。 2>循环服务器和并发服务器
详解 linux中的关机和重启命令 一 shutdown命令 shutdown [选项] 时间 选项: ?
首先,将json串转为一个JObject对象: ? 1
matplotlib官网 matplotlib库默认英文字体 添加黑体(‘SimHei')为绘图字体 代码: plt.rcParams['font.sans-serif']=['SimHei'
在并发编程中,synchronized关键字是常出现的角色。之前我们都称呼synchronized关键字为重量锁,但是在jdk1.6中对synchronized进行了优化,引入了偏向锁、轻量锁。本篇
一般我们的项目中会使用1到2个数据库连接配置,同程艺龙的数据库连接配置被收拢到统一的配置中心,由DBA统一配置和维护,业务方通过某个字符串配置拿到的是Connection对象。  
实例如下: ? 1
1. MemoryCahe NetCore中的缓存和System.Runtime.Caching很相似,但是在功能上做了增强,缓存的key支持object类型;提供了泛型支持;可以读缓存和单个缓存
argument是javascript中函数的一个特殊参数,例如下文,利用argument访问函数参数,判断函数是否执行 复制代码 代码如下: <script
一不小心装了一个Redis服务,开了一个全网的默认端口,一开始以为这台服务器没有公网ip,结果发现之后悔之莫及啊 某天发现cpu load高的出奇,发现一个minerd进程 占了大量cpu,googl
今天写这个是为了 提醒自己 编程过程 不仅要有逻辑 思想 还有要规范 代码 这样可读性 1、PHP 编程规范与编码习惯最主要的有以下几点: 1 文件说明 2 funct
摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具。一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型。本文描述了在一个虚拟机中安装lspci工具的具体步骤。 由于要测试
1、修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统
目录 算术运算符 基本四则运算符 增量赋值运算符 自增/自减运算符 关系运算符 逻
如下所示: ? 1
MapperScannerConfigurer之sqlSessionFactory注入方式讲解 首先,Mybatis中的有一段配置非常方便,省去我们去写DaoImpl(Dao层实现类)的时间,这个
Linux的网络虚拟化是LXC项目中的一个子项目,LXC包括文件系统虚拟化,进程空间虚拟化,用户虚拟化,网络虚拟化,等等,这里使用LXC的网络虚拟化来模拟多个网络环境。 本文从基本的网络设备讲
? 1
我是一名优秀的程序员,十分优秀!