diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/MsgHandlerDispatcher.java b/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/MsgHandlerDispatcher.java index fe91be6d..5088b3f9 100644 --- a/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/MsgHandlerDispatcher.java +++ b/src/main/java/com/gzzn/omms/msgexchangeapi/msghandler/MsgHandlerDispatcher.java @@ -12,7 +12,7 @@ import com.gzzn.omms.msgexchangeapi.entity.Cminmsg; import com.gzzn.omms.msgexchangeapi.entity.msg.Msg; import com.gzzn.omms.msgexchangeapi.service.IExchangeService; -@Service +@Service("msgHandlerDispatcher") public class MsgHandlerDispatcher { private Logger logger = LoggerFactory.getLogger(MsgHandlerDispatcher.class); diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/runner/AppRunner.java b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/AppRunner.java index e8fdabd9..b8801dc1 100644 --- a/src/main/java/com/gzzn/omms/msgexchangeapi/runner/AppRunner.java +++ b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/AppRunner.java @@ -38,5 +38,11 @@ public class AppRunner implements CommandLineRunner { redisService.set(RedisKeyConstant.KEY_WAITSCHDDATE,nowDate); //初始化消息进度 logger.info("发送获取动态航班日计划的消息完成"); + + + //启动线程等待日航班计划消息返回 + Thread t = new Thread(new SchdWaitRunner()); + t.run(); + }//end function run } diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/runner/MsgExchangeRunner.java b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/MsgExchangeRunner.java new file mode 100644 index 00000000..a34a8257 --- /dev/null +++ b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/MsgExchangeRunner.java @@ -0,0 +1,64 @@ +package com.gzzn.omms.msgexchangeapi.runner; + +import java.util.List; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.gzzn.omms.msgexchangeapi.entity.Cminmsg; +import com.gzzn.omms.msgexchangeapi.msghandler.MsgHandlerDispatcher; +import com.gzzn.omms.msgexchangeapi.redis.RedisKeyConstant; +import com.gzzn.omms.msgexchangeapi.redis.RedisService; +import com.gzzn.omms.msgexchangeapi.service.ICminmsgService; +import com.gzzn.omms.msgexchangeapi.utils.SpringUtil; + +/** + * 消息获取分派类 + * @author zhouxiunai + * + */ +public class MsgExchangeRunner implements Runnable{ + private static Logger logger = LoggerFactory.getLogger(MsgExchangeRunner.class); + + private MsgHandlerDispatcher msgHandlerDispatcher; + private RedisService redisService; + private ICminmsgService cminmsgService; + + public MsgExchangeRunner() { + redisService = (RedisService) SpringUtil.getBean("redisService"); + cminmsgService = (ICminmsgService) SpringUtil.getBean("cminmsgService"); + msgHandlerDispatcher = (MsgHandlerDispatcher) SpringUtil.getBean("msgHandlerDispatcher"); + } + + + @Override + public void run() { + logger.info("进入获取动态航班消息..."); + + //获取上次的beginId + Integer beginIdInt = (Integer)redisService.get(RedisKeyConstant.KEY_LASTBEGINID); + Long beginId = beginIdInt.longValue(); + + logger.info("从上次获取的消息位置{}开始",beginId); + + + //获取航班动态消息 + List lsCminmsgs = cminmsgService.getNewMsgsAfterId(beginId); + if(null == lsCminmsgs || lsCminmsgs.size() <= 0) + { + logger.info("本周期没有获取到最新消息,直接退出本次循环"); + return; + } + + + logger.info("获取到{}条最新信息,准备更新动态航班信息",lsCminmsgs.size()); + + //分发消息进行处理 + for (Cminmsg cminmsg : lsCminmsgs) { + msgHandlerDispatcher.dispatch(cminmsg); + }//end for + + + logger.info("本次定时获取新消息完成..."); + }//end run +} diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/runner/SchdWaitRunner.java b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/SchdWaitRunner.java new file mode 100644 index 00000000..2c594f31 --- /dev/null +++ b/src/main/java/com/gzzn/omms/msgexchangeapi/runner/SchdWaitRunner.java @@ -0,0 +1,99 @@ +package com.gzzn.omms.msgexchangeapi.runner; + +import java.util.Date; +import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.gzzn.omms.msgexchangeapi.entity.Cminmsg; +import com.gzzn.omms.msgexchangeapi.redis.RedisKeyConstant; +import com.gzzn.omms.msgexchangeapi.redis.RedisService; +import com.gzzn.omms.msgexchangeapi.service.ICminmsgService; +import com.gzzn.omms.msgexchangeapi.service.flightInfo.IFlightInfoService; +import com.gzzn.omms.msgexchangeapi.utils.SpringUtil; + +/** + * 等待航班日计划返回线程 + * @author zhouxiunai + * + */ +public class SchdWaitRunner implements Runnable { + private static Logger logger = LoggerFactory.getLogger(SchdWaitRunner.class); + + private RedisService redisService; + private ICminmsgService cminmsgService; + private IFlightInfoService flightInfoService; + + public SchdWaitRunner() + { + flightInfoService = (IFlightInfoService) SpringUtil.getBean("flightInfoService"); + redisService = (RedisService) SpringUtil.getBean("redisService"); + cminmsgService = (ICminmsgService) SpringUtil.getBean("cminmsgService"); + } + + @Override + public void run() { + logger.info("获取日计划航班信息返回结果开始..."); + Boolean isRun = true; + Long intervalMs = 3000L; + Long tryTimes = 0L; + + while (isRun) { + tryTimes++; + logger.info("尝试第{}次获取返回日计划消息",tryTimes); + + //获取 + Date waitSchdDate = (Date) redisService.get(RedisKeyConstant.KEY_WAITSCHDDATE); + Optional opCminmsg = cminmsgService.getRespSchdCminmsg(waitSchdDate,10,3000L); + if(!opCminmsg.isPresent()) + { + sleepInMs(intervalMs); + continue ; + } + + //更新 + logger.info("找到返回的动态航班计划,开始更新动态航班信息..."); + Boolean updateResult = flightInfoService.updateByDaySchd(opCminmsg.get()); + if(false == updateResult) + { + logger.warn("更新动态航班信息失败,稍后重试..."); + sleepInMs(intervalMs); + continue ; + } + + //状态记录 + Long beginId = opCminmsg.get().getCminmsgsId(); + redisService.set(RedisKeyConstant.KEY_LASTBEGINID,beginId); + + + Boolean isWaitSchd = false; + redisService.set(RedisKeyConstant.KEY_ISWAITSCHD,isWaitSchd); + + //启动消息采集线程 + ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1); + scheduledExecutorService.scheduleAtFixedRate(new MsgExchangeRunner(), 0, 30 , TimeUnit.SECONDS); + + + isRun = false; //退出 + } + + logger.info("获取日计划航班信息返回结果结束..."); + } //end run + + /** + * 休眠指定时间间隔-毫秒 + * @param intervalMs + */ + private void sleepInMs(Long intervalMs) + { + try { + Thread.sleep(intervalMs); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/com/gzzn/omms/msgexchangeapi/task/ExchangeTask.java b/src/main/java/com/gzzn/omms/msgexchangeapi/task/ExchangeTask.java deleted file mode 100644 index d9dfedbe..00000000 --- a/src/main/java/com/gzzn/omms/msgexchangeapi/task/ExchangeTask.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.gzzn.omms.msgexchangeapi.task; - -import java.util.Date; -import java.util.List; -import java.util.Optional; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import com.gzzn.omms.msgexchangeapi.entity.Cminmsg; -import com.gzzn.omms.msgexchangeapi.msghandler.MsgHandlerDispatcher; -import com.gzzn.omms.msgexchangeapi.redis.RedisKeyConstant; -import com.gzzn.omms.msgexchangeapi.redis.RedisService; -import com.gzzn.omms.msgexchangeapi.service.ICminmsgService; -import com.gzzn.omms.msgexchangeapi.service.flightInfo.IFlightInfoService; - - -/** - * 转换任务,获取cim的消息,转换成json,写入到kafka队列中 - * @author Administrator - * - */ -@Component -public class ExchangeTask { - private static Logger logger = LoggerFactory.getLogger(ExchangeTask.class); - - @Autowired - MsgHandlerDispatcher msgHandlerDispatcher; - - - @Autowired - RedisService redisService; - - - - @Autowired - private ICminmsgService cminmsgService; - - - @Autowired - private IFlightInfoService flightInfoService; - - @Scheduled(cron="0 0/1 * * * ?") - public void corn() - { - logger.info("进入获取动态航班消息..."); - - Boolean isWaitSchd = (Boolean)redisService.get(RedisKeyConstant.KEY_ISWAITSCHD); - if (isWaitSchd) { - Date waitSchdDate = (Date)redisService.get(RedisKeyConstant.KEY_WAITSCHDDATE); - Optional opCminmsg = cminmsgService.getRespSchdCminmsg(waitSchdDate,10,3000L); - if(opCminmsg.isPresent()) { - //如果找到,添加到内存数据库动态航班信息表 - logger.info("找到返回的动态航班计划,开始更新动态航班信息..."); - Boolean updateResult = flightInfoService.updateByDaySchd(opCminmsg.get()); - if(false == updateResult) - { - logger.error("更新动态航班信息失败"); - return ; - } - - // - Long beginId = opCminmsg.get().getCminmsgsId(); - redisService.set(RedisKeyConstant.KEY_LASTBEGINID,beginId); - - - //更新状态 - isWaitSchd = false; - redisService.set(RedisKeyConstant.KEY_ISWAITSCHD,isWaitSchd); - - logger.info("动态航班计划更新完成..."); - } - else { - logger.error("获取动态航班消息失败,退出本次周期..."); - return ; - } - } // end if 获取航班日记录 - - - //获取上次的beginId - Integer beginIdInt = (Integer)redisService.get(RedisKeyConstant.KEY_LASTBEGINID); - Long beginId = beginIdInt.longValue(); - - logger.info("从上次获取的消息位置{}开始",beginId); - - - //获取航班动态消息 - List lsCminmsgs = cminmsgService.getNewMsgsAfterId(beginId); - if(null == lsCminmsgs || lsCminmsgs.size() <= 0) - { - logger.info("本周期没有获取到最新消息,直接退出本次循环"); - return; - } - - logger.info("获取到{}条最新信息,准备更新动态航班信息",lsCminmsgs.size()); - - //分发消息进行处理 - for (Cminmsg cminmsg : lsCminmsgs) { - msgHandlerDispatcher.dispatch(cminmsg); - }//end for - - - logger.info("本次定时获取新消息完成..."); - } //end function -}