Java 信号量机制的实践用途之——流量控制

编程入门 行业动态 更新时间:2024-10-21 06:26:09

Java <a href=https://www.elefans.com/category/jswz/34/1769130.html style=信号量机制的实践用途之——流量控制"/>

Java 信号量机制的实践用途之——流量控制

信号量机制

        使用java.util.concurrent下的semaphore类作为信号量

用途

        设置一个信号量Map,需要时从此Map中get(特定ID)信号量来控制访问请求数量,以实现对单个请求的流量控制,增加系统稳定性。

用法

  1. 编写SemaphoreManager实现对信号量统一管理
    1. 声明信号量Map  Map<Long, Semaphore> semaphoreMap
    2. 编写初始化信号量的方法init(args...),设置初始大小的信号量Map
    3. 编写获取信号量的方法(getSemaphore(args...))、创建信号量方法(createSemaphore(size)),创建信号量时,直接new Semaphore(size)对象即可。

使用时可以在项目初始化方法中、aop中、或相应业务代码中引入使用。

 以下是代码部分

SemaphoreManager

@Component
public class SemaphoreManager {@Resourceprivate DisConfig disConfig;private Map<Long, Semaphore> semaphoreMap = new HashMap<>();/*** 初始化信号量对象** @param list 对象信息列表*/public void init(Collection<ObjectDO> list) {if (CollectionUtils.isEmpty(list)) {return;}// 为每个第三方系统生成一个信号量对象for (ObjectDO objectDO: list) {// 创建信号量对象semaphoreMap.put(objectDO.getId(), createSemaphore(objectDO.getMaxConcurrentNum()));}}/*** 获取信号量对象** @return 信号量对象*/public Semaphore getSemaphore() {ObjectContext context = ContextManager.getContext();if (context == null) {return null;}return getSemaphore(context.getObjectId(), context.getMaxConcurrentNum());}/*** 获取信号量对象** @param objectId 对象ID* @param maxConcurrentNum 最大并发数* @return 信号量对象*/private Semaphore getSemaphore(Long objectId, Integer maxConcurrentNum) {if (semaphoreMap == null) {return null;}// 获取当前对接通道的信号量对象Semaphore semaphore = semaphoreMap.get(objectId);if (semaphore != null) {return semaphore;}synchronized (objectId.toString().intern()) {semaphore = createSemaphore(maxConcurrentNum);semaphoreMap.put(objectId, semaphore);}return semaphore;}/*** 创建信号量对象** @param maxConcurrentNum 最大并发数* @return 信号量对象*/private Semaphore createSemaphore(Integer maxConcurrentNum) {// 如果DB中没有设置则使用disconf中设置的默认值if (maxConcurrentNum == null || maxConcurrentNum == 0) {maxConcurrentNum = disConfig.getMaxSemp();}if (maxConcurrentNum == 0) {maxConcurrentNum = 100;}return new Semaphore(maxConcurrentNum);}}

 代码使用实践

                Boolean isAcq = false;// 获取信号量对象semaphore = semaphoreManager.getSemaphore();if (semaphore != null) {// 获取信号量isAcq = semaphore.tryAcquire();// 获取失败时说明请求量过大, 直接返回异常信息AssertUtil.isTrue(isAcq, EnumResultCode.THIRD_SLOWLY);}

更多推荐

Java 信号量机制的实践用途之——流量控制

本文发布于:2023-11-15 09:09:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1597208.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:信号量   用途   机制   流量控制   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!