勒流网站建设制作,青岛市蓝色经济区建设官方网站,网站设计中超链接怎么做,毕业设计指导网站建设前段时间在群里面发现有个群友抛出一个实际需求#xff1a;需要通过一个接口拉取数据#xff0c;这个接口有每秒10QPS限制#xff0c;请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS#xff1f;我觉得这个需求挺有意思的#xff0c;跟某群友讨论#xff0c…前段时间在群里面发现有个群友抛出一个实际需求需要通过一个接口拉取数据这个接口有每秒10QPS限制请问如何实现数据拉去效率最大化且限制调用拉取接口每秒10PQPS我觉得这个需求挺有意思的跟某群友讨论发现可以利用JUC包下的Semaphore实现几行代码就能搞定。这里将实现方案做下整理算是抛砖引玉吧~ 利用Semaphore实现多线程调用接口 一、代码实现1.自定义线程池ExecutorConfig2.获取数据接口DataFetchService3.拉取数据接口核心实现RateLimitedDataFetcher4.接口实现类DataFetchServiceImpl5.UserController控制层 二、项目结构及源码下载地址 一、代码实现
1.自定义线程池ExecutorConfig
/*** 线程池配置*/
Component
public class ExecutorConfig {private static int maxPoolSize Runtime.getRuntime().availableProcessors();private volatile static ExecutorService executorService;public static ExecutorService getThreadPool() {if (executorService null){synchronized (ExecutorConfig.class){if (executorService null){executorService newThreadPool();}}}return executorService;}private static ExecutorService newThreadPool(){int queueSize 1000;int corePool Math.min(10, maxPoolSize);return new ThreadPoolExecutor(corePool, maxPoolSize, 10000L, TimeUnit.MILLISECONDS,new LinkedBlockingQueue(queueSize),new ThreadPoolExecutor.AbortPolicy());}private ExecutorConfig(){}
}2.获取数据接口DataFetchService
/*** 获取数据*/
public interface DataFetchService {/*** 获取数据* return ListUser*/ListUser dataFetchTask();
}3.拉取数据接口核心实现RateLimitedDataFetcher
Service
Slf4j
public class RateLimitedDataFetcher {Autowiredprivate UserMapper userMapper;private static final int MAX_REQUESTS_PER_SECOND 10;private Semaphore semaphore new Semaphore(MAX_REQUESTS_PER_SECOND);private ExecutorService executorService ExecutorConfig.getThreadPool();public FutureListUser fetchData(Integer id) {return executorService.submit((CallableListUser) () - {try {// 获取许可semaphore.acquire();// 执行网络请求这里简化为一个延迟操作QueryWrapper qw new QueryWrapper();//lt是小于id小于5qw.lt(id, id);return userMapper.selectList(qw);} catch (InterruptedException e) {e.printStackTrace();return null;} finally {// 释放许可semaphore.release();}});}
}4.接口实现类DataFetchServiceImpl
Service
Slf4j
public class DataFetchServiceImpl implements DataFetchService {Autowiredprivate UserMapper userMapper;Autowiredprivate RateLimitedDataFetcher rateLimitedDataFetcher;Overridepublic ListUser dataFetchTask() {ListUser userList null;try {userList rateLimitedDataFetcher.fetchData(2).get();} catch (InterruptedException | ExecutionException e) {log.error(DataFetchServiceImpl dataFetchTask error:{},e.getMessage());}return userList;}
}5.UserController控制层
/*** 用户控制层** author hua*/
RestController
RequestMapping(value /user)
public class UserController {Autowiredprivate DataFetchService dataFetchService;GetMapping(value /getBatchUser)public ResponseEntityListUser getBatchUser() {ListUser users dataFetchService.dataFetchTask();HttpStatus status users null ? HttpStatus.NOT_FOUND: HttpStatus.OK;return new ResponseEntity(users, status);}
}二、项目结构及源码下载地址 下载地址 springboot-cacheable 欢迎star哦~