当前位置: 首页 > news >正文

开发一个直播平台需要多少钱湖南靠谱seo优化公司

开发一个直播平台需要多少钱,湖南靠谱seo优化公司,做网站自己有模板要花多少钱,安徽省和住房建设厅网站基于Redis加锁注解AOP解决JOB重复执行问题 现象解决方案自定义注解定义AOP策略redis 加锁实践 现象 线上xxljob有时候会遇到同一个任务在调度的时候重复执行,如下图: 线上JOB服务运行了2个实例,有时候会重复调度到同一个实例,有…

基于Redis加锁+注解+AOP解决JOB重复执行问题

  • 现象
  • 解决方案
    • 自定义注解
    • 定义AOP策略
    • redis 加锁
    • 实践

现象

线上xxljob有时候会遇到同一个任务在调度的时候重复执行,如下图:
在这里插入图片描述

线上JOB服务运行了2个实例,有时候会重复调度到同一个实例,有时候会重复调度到不同实例上,对于Job重复执行会存在很多风险,可以采用Redis加锁的方式来解决。这里用统一的方式提供这个内部功能,其他Job或者从管理页面进来的请求直接执行Job可以都限制住,保证同一时间分布式环境中只有一个实例在运行。

解决方案

自定义注解

首先定义一个自定义注解,将redis加锁需要的参数可以通过注解声明:

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface JobNoRepete {
String name();
String redisKey();
long expireTime();
TimeUnit timeUnit();
}

定义AOP策略

@Component
@Aspect
@Slf4j
public class JobNoRepeteAop {
@Resourceprivate RedisService redisService;
@Around(value = "@annotation(annotation)", argNames = "pj,annotation")public Object around(ProceedingJoinPoint pj, JobRepetitionDefense annotation) throws Throwable {String name = annotation.name();String redisKey = annotation.redisKey();long expireTime = annotation.expireTime();TimeUnit timeUnit = annotation.timeUnit();log.info("job执行防重开始执行,name={},redisKey={},expireTime={},timeUnit={}",name, redisKey, expireTime, timeUnit);try {return redisService.executeOnlyOnce(redisKey, expireTime, timeUnit, pj::proceed);} finally {log.info("job执行防重执行完成,name={}", name);}}

}

redis 加锁

redis 加锁逻辑,使用spring redis中的StringRedisTemplate:

@Slf4j
@Component
public class RedisService {@Resourceprivate StringRedisTemplate stringRedisTemplate;public <T> T executeOnlyOnce(String redisKey, long expireTime, TimeUnit timeUnit, CustomCallable<T> callable) throws Throwable {if (StrUtil.isBlank(redisKey) || expireTime <= 0 || Objects.isNull(timeUnit) || Objects.isNull(callable)) {throw new IllegalArgumentException("参数错误");}String uuid = UUID.randomUUID().toString();if (!stringRedisTemplate.opsForValue().setIfAbsent(redisKey, uuid, expireTime, timeUnit)) {throw new RuntimeException("任务正在执行,请稍后再试");}//执行逻辑try {return callable.call();} finally {//执行完成主动释放锁try {String oldValue = stringRedisTemplate.opsForValue().get(redisKey);if (Objects.equals(uuid, oldValue)) {stringRedisTemplate.delete(redisKey);}} catch (Exception e) {//释放锁失败,等待expireTime后自动释放log.error("释放锁异常", e);}}}
}
public interface CustomCallable<V> {V call() throws Throwable;
}

实践

对于适用的场景就可以直接使用注解的方式进行声明,例如:

@Service
@Slf4j
public class testService {
private static final int EXPIRE_HOURS = 24;
@JobNoRepete(name = "测试redis", redisKey = Constant.JOB_LOCK_TO_REDIS,expireTime = EXPIRE_HOURS, timeUnit = TimeUnit.HOURS)public void test(LocalDate localDate) {//内部逻辑}
}
http://www.mmbaike.com/news/85805.html

相关文章:

  • 做电影网站 广告收入推广公众号
  • 国外做游戏的视频网站松松软文平台
  • 网站asp木马删除网上企业推广
  • 电商网站前端设计方案百度首页快速排名系统
  • 苏州建设培训中心网站看颜色应该搜索哪些词汇
  • 怎样优化排名自己网站seo关键词排名优化系统
  • 网投网站建设百度竞价排名又叫什么
  • 娄底网站建设方案百度网站电话是多少
  • 做品牌网站怎么样百度关键词优化平台
  • 网站建设美工招聘百度竞价关键词价格查询
  • 怎么筛选一家做网站做的好的公司网络营销案例成功案例
  • 沈阳个人做网站广东东莞疫情最新消息
  • 网站建设论文的中期报告营销方法有哪几种
  • 哪里有网站建设培训班如何开发一个软件平台
  • 网站服务器有哪些类型有哪些类型有哪些类型有哪些排名第一的助勃药
  • 沈阳高端网站开发建设百度合作平台
  • 做外贸用什么网站比较好营销策划方案公司
  • 做网站发违规内容 网警抓不抓热搜在哪里可以看
  • 网站建设基础策划书企业网站seo推广方案
  • 长沙手机网站建设公司哪家好白帽优化关键词排名seo
  • 花钱推广的网络平台百度seo推广是什么
  • 个人主页界面网站网站建设流程图
  • 廊坊关键词优化平台seo的内容有哪些
  • 做的网站有营销效果吗软文推广怎么写
  • dede网站后台地址扫描如何开通自己的网站
  • 东易日盛装饰公司口碑seo关键词排名报价
  • 网站基础建设和管理东莞seo建站
  • iis html网站百度代运营推广
  • 建行网站会员是什么免费涨热度软件
  • 免费织梦网站源码生成关键词的软件