@Slf4jpublicclassThreadPoolUtil{privatestatic final int CORE_POOL_SIZE =(int)(Runtime.getRuntime().availableProcessors()/(1-0.5f));privatestatic final int MAX_POOL_SIZE =35;privatestatic final long KEEP_LIVE_TIME =60L;privatestatic final BlockingQueue<Runnable> BLOCKING_QUEUE =newLinkedBlockingQueue<>();publicstatic final ThreadPoolExecutor POOL;static{
POOL =newThreadPoolExecutor(CORE_POOL_SIZE,
MAX_POOL_SIZE,
KEEP_LIVE_TIME,
TimeUnit.MILLISECONDS,
BLOCKING_QUEUE,
Executors.defaultThreadFactory(),newThreadPoolExecutor.DiscardOldestPolicy());}/**
* 取消当前正在执行的任务
*/publicstaticvoidcancelTask(Future<?> future){// 终止正在执行的任务if(ObjectUtil.isNotNull(future)&&!future.isDone()&&!future.isCancelled()){
future.cancel(true);}}/**
* 释放线程池
*/publicstaticvoidshutdownAndAwaitTermination(){if(POOL !=null&&!POOL.isShutdown()){
POOL.shutdown();try{if(!POOL.awaitTermination(120, TimeUnit.SECONDS)){
POOL.shutdownNow();if(!POOL.awaitTermination(120, TimeUnit.SECONDS)){
log.info("pool did not termination");}}}catch(InterruptedException e){
POOL.shutdownNow();
Thread.currentThread().interrupt();}}}}
VideoTimer
/**
* 请求rtmp服务状态地址,获取nclients在线客户端数量,等于1时表示没有被预览
*
*/
@Slf4j
@ComponentpublicclassVideoTimer{/** */privatestatic final String RTMP_STAT_URL ="http://***.***.***.***/stat";privatestatic final int TIME_OUT =3000;
@Scheduled(cron ="0/5 * * * * ?")publicvoidconfigureTasks(){
List<String> rtmpStatList =getRtmpStat();if(CollUtil.isNotEmpty(rtmpStatList)){for(String key : rtmpStatList){VideoDTO video = VideoDataCache.VIDEO_MAP.get(key);if(ObjectUtil.isNotNull(video)&& video.getOpentime().plusMinutes(1).isBefore(LocalDateTime.now())){
log.info("Video Streaming Stop ={}", video);
VideoDataCache.remove(key);}}}}privatestatic List<String>getRtmpStat(){try{String body = HttpRequest.get(RTMP_STAT_URL).timeout(TIME_OUT).execute().body();returnxmlToObj(body);}catch(Exception e){
e.printStackTrace();}returnnull;}privatestatic List<String>xmlToObj(String xmlStr){
List<String> resList =newArrayList<>();if(StrUtil.isBlank(xmlStr)&&!xmlStr.contains("<live>")){return resList;}String live = StrUtil.subBetween(xmlStr,"<live>","</live>");if(!live.contains("<stream>")){return resList;}
String[] split = StrUtil.split(live,"</stream>");for(int i =0; i < split.length; i++){String s = split[i];if(s.contains("<name>")&& s.contains("<nclients>")){Integer nclients = Integer.valueOf(StrUtil.subBetween(s,"<nclients>","</nclients>"));if(nclients ==1){String name = StrUtil.subBetween(s,"<name>","</name>");
resList.add(name);}}}return resList;}}