package com.dy.pipIrrRemote.video; import com.dy.common.multiDataSource.DataSourceContext; import com.dy.pipIrrGlobal.pojoVi.ViYsApp; import com.dy.pipIrrGlobal.util.Org; import com.dy.pipIrrGlobal.util.OrgListenerSupport; import com.dy.pipIrrRemote.video.ys.YsAppClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.context.ApplicationListener; import org.springframework.core.io.ResourceLoader; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import java.util.*; /** * @Author: liurunyu * @Date: 2025/6/6 17:19 * @Description 视频监控 * 监听器,实现功能:启动日统计定时任务 * 本监听器不能采用ServletContextListener方式,因为Servlet上下文Context创建后 * Spring容器并没有创建完,而本类中用了Spring容器中的Bean,即*Dao 。 * 所以采用了Spring事件监听器来实现 */ @Slf4j @Component public class YsAppListener extends OrgListenerSupport implements ApplicationListener { @Autowired protected ResourceLoader resourceLoader ; @Autowired protected YsAppCtrl ysAppCtrl; @Autowired protected YsAppClient ysAppClient; /** * SpringBoot容器已经准备好了,执行下面方法 * @param event 事件 */ @Override public void onApplicationEvent(@NonNull ApplicationReadyEvent event) { try { //等1秒,等待com.alibaba.druid.pool.DruidDataSource初始化完成 Thread.sleep(1000L); } catch (InterruptedException e) { e.printStackTrace(); }finally { try{ super.init(resourceLoader); this.atSysStart(event); }catch (Exception e){ log.error("注册萤石云定时任务出错", e); } } } /** * 初始化 */ private void atSysStart(ApplicationReadyEvent event) throws Exception{ //所有Org,共用一个萤石应用的AccessToken boolean isNowGetNewAccessToken = false ;//当下是否获得AccessToken List orgList = Org.OrgList ; Map viYsAppMap = new HashMap<>() ; if(orgList != null && orgList.size() >0){ for(Org.OrgVo vo : orgList){ //遍历所有org,得到各自的萤石应用AccessToken DataSourceContext.set(vo.tag);//设置数据源 ViYsApp po = ysAppCtrl.selectSingletonYsApp() ; if(po == null){ isNowGetNewAccessToken = true ; }else{ viYsAppMap.put(vo.tag, po) ; } } this.dealAtSysStart(viYsAppMap, isNowGetNewAccessToken); } } private void dealAtSysStart(Map viYsAppMap, boolean isNowGetNewAccessToken){ if(!isNowGetNewAccessToken){ if(viYsAppMap != null && viYsAppMap.size() >0){ long nowMustAtMillis = System.currentTimeMillis() ; Collection col = viYsAppMap.values() ; Iterator it = col.iterator() ; ViYsApp po ; while (it.hasNext()){ po = it.next() ; if(po.expireTime != null && nowMustAtMillis > po.expireTime){ isNowGetNewAccessToken = true ; } } }else{ isNowGetNewAccessToken = true ; } } if(isNowGetNewAccessToken){ this.ysAppClient.getAccessToken(); this.ysAppClient.reSetNextGetAccessToken(null) ; }else{ long nextGetTokenAtMillis = 0L ; Collection col = viYsAppMap.values() ; Iterator it = col.iterator() ; ViYsApp po ; while (it.hasNext()){ po = it.next() ; if(nextGetTokenAtMillis == 0 || nextGetTokenAtMillis > po.expireTime){ nextGetTokenAtMillis = po.expireTime ; } } if(nextGetTokenAtMillis > 0L){ this.ysAppClient.reSetNextGetAccessToken(nextGetTokenAtMillis); } } } }