package itn.let.schdlr.service; import java.text.SimpleDateFormat; import java.util.Date; import javax.annotation.Resource; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Profile; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import com.ibm.icu.util.Calendar; import com.ibm.icu.util.GregorianCalendar; import egovframework.rte.fdl.property.EgovPropertyService; import itn.com.uss.olh.hpc.service.HackIpService; import itn.com.utl.fcc.service.EgovDateUtil; import itn.let.fax.admin.service.FaxAdmService; import itn.let.fax.admin.service.FaxStatVO; import itn.let.kakao.admin.kakaoAt.service.MjonKakaoAtStatVO; import itn.let.kakao.admin.statistics.service.KakaoStatisticsService; import itn.let.mail.service.MailTemplateService; import itn.let.mjo.msg.service.MjonMsgService; import itn.let.mjo.msg.service.MjonMsgStatVO; import itn.let.sts.com.StatsVO; import itn.let.sts.cst.service.EgovConectStatsService; import itn.let.uss.umt.service.EgovUserManageService; import itn.let.utl.user.service.MjonNoticeSendUtil; import net.javacrumbs.shedlock.core.LockProvider; import net.javacrumbs.shedlock.core.SchedulerLock; import net.javacrumbs.shedlock.provider.jdbctemplate.JdbcTemplateLockProvider; import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; @Profile("!local") @Service("SchedulerUtil") @EnableScheduling @EnableSchedulerLock(defaultLockAtMostFor = "PT30S") // Scheduler Lock 사용 가능 설정 (기본 30초동안 Lock) public class SchedulerUtil { @Resource(name = "SchdlrManageService") private SchdlrManageService schdlrManageService; @Resource (name = "MailTemplateService") private MailTemplateService mailTemplateService; @Resource (name = "userManageService") private EgovUserManageService egovUserManageService; @Resource(name = "hackIpService") private HackIpService hackIpService; @Resource(name = "mjonMsgService") private MjonMsgService mjonMsgService; @Resource(name = "KakaoStatisticsService") private KakaoStatisticsService kakaoStatisticsService; @Resource(name = "propertiesService") protected EgovPropertyService propertyService; @Resource(name = "conectStatsService") private EgovConectStatsService conectStatsService; /** 알림전송 Util */ @Resource(name = "mjonNoticeSendUtil") private MjonNoticeSendUtil mjonNoticeSendUtil; @Resource(name = "faxAdmService") private FaxAdmService faxAdmService; /** 설정값 가져오기 */ @Value("#{globalSettings['Globals.Env']}") private String GlobalsEnv; private static final String ONE_MIN = "PT1M"; // 1분동안 LOCK /* * 2분 마다 1주일 데이터에서 환불 대상을 찾아서 환불 한다. * */ // Schdule Lock (2분동안) @Scheduled(cron = "0 0/2 * * * ?") @SchedulerLock(name = "runScenarioOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runScenarioOneTime() throws Exception { // do something... try { System.out.println("=============SchedulerUtil=====runScenarioOneTime =============>"); //문자 환불, 팩스 환불 PayBack(""); /* // 문자 환불 schdlrManageService.msgFailPayBack(); * */ // do something... }catch(Exception ex) { ex.printStackTrace(); } } /* * 매일 5시20분에 31일전 데이터에서 환불 대상을 찾아서 환불 한다. * */ @Scheduled(cron = "20 20 5 * * ?") @SchedulerLock(name = "runScenarioOneTimeOneByDay", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runScenarioOneTimeOneByDay() throws Exception { // do something... try { System.out.println("=============EgovSysLogScheduling=====runScenarioOneTimeOneByDay =============>"); //문자 환불, 팩스 환불 PayBack("ONE"); /* // 문자 환불 schdlrManageService.msgFailPayBack(); * */ }catch(Exception ex) { ex.printStackTrace(); } } // Schdule Lock (2분동안) //세틀뱅크 자동 충전 배치 @Scheduled(cron = "0 0/2 * * * ?") @SchedulerLock(name = "runVacsChargeOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runVacsChargeOneTime() throws Exception { System.out.println("=============EgovSysLogScheduling=====runVacsChargeOneTime =============>"); // do something... try { schdlrManageService.vacsAutoCharge(); }catch(Exception ex) { ex.printStackTrace(); } } // 매일 오전 6시마다 실행 ex) 06:00 @Scheduled(cron = "0 0 6 * * *") @SchedulerLock(name = "runMailSendMemberDormant", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runMailSendMemberDormant() throws Exception { // 휴면회원 메일발송 //mailTemplateService.mailSendMemberDormant(); System.out.println("=============EgovSysLogScheduling=====runMailSendMemberDormant =============>"); try { mailTemplateService.mailSendMemberDormant(); // do something... }catch(Exception ex) { ex.printStackTrace(); } } // 매달 1일 0시 10분 실행 // "0 10 0 1 * *" // 매달 3일 6시 40분 실행 // "0 40 18 3 * *" // 매일 오전 1시 1분 0초 // "0 1 1 * * *" // @Scheduled(cron = "0 * * * * *") // 1분마다 실행(TEST) @Scheduled(cron = "0 1 0 1 * *") // 매달 1일 0시 1분 실행 @SchedulerLock(name = "runUserCashByAutoCashUpdate", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runUserCashByAutoCashUpdate() throws Exception { //System.out.println("AutoCash Start"); // 후불제회원 Cash충전 //egovUserManageService.updateUserCashByAutoCash(); //System.out.println("AutoCash End"); try { System.out.println("AutoCash Start"); // 후불제회원 Cash충전 egovUserManageService.updateUserCashByAutoCash(); }catch(Exception ex) { ex.printStackTrace(); } } // 트래픽 감시 스케줄러 // 매분마다 실행 @Scheduled(cron = "37 * * * * *") @SchedulerLock(name = "highTrafficIgnoreIpInsert", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void highTrafficIgnoreIpInsert() throws Exception { //5분 내 300회 이상 접속로그가 있는 경우 차단아이피 등록 //hackIpService.selectHighTrafficNotIgnoreIp(); try { System.out.println("=============EgovSysLogScheduling=====highTrafficIgnoreIpInsert =============>"); //5분 내 300회 이상 접속로그가 있는 경우 차단아이피 등록 hackIpService.selectHighTrafficNotIgnoreIp(); // do something... }catch(Exception ex) { ex.printStackTrace(); } } // AGENT별 SMS LMS MMS 발송건수 , 카카오 알림톡 발송건수 통계 스케쥴러 // @Scheduled(cron = "0 */10 * * * *") //10분마다 실행(TEST) @Scheduled(cron = "0 10 1 * * *") // 매일 새벽1시 10분 실행 // @Scheduled(cron = "0 */30 * * * *") // 30분마다 실행 @SchedulerLock(name = "insertAgentSmsCountStat", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void agentSmsCountStatInsert() throws Exception { // agent별 sms lms mms 발송건수 통계 데이터 upsert //System.out.println("insertAgentSmsCountStat scheduler RUN (YESTERDAY)"); // int nowDate =EgovDateUtil.nowDateToInt("yyyyMMdd"); //int minusDate =EgovDateUtil.dayMinusToInt("yyyyMMdd", 1); // 전일 문자발송 건 통계 insert //MjonMsgStatVO mjonMsgStatVO = new MjonMsgStatVO(); //mjonMsgStatVO.setStatStartDate(minusDate); //mjonMsgStatVO.setStatEndDate(minusDate); //mjonMsgService.insertAgentSmsCountStat(mjonMsgStatVO); try { System.out.println("=============EgovSysLogScheduling=====insertAgentSmsCountStat scheduler RUN (YESTERDAY) =============>"); // int nowDate =EgovDateUtil.nowDateToInt("yyyyMMdd"); int minusDate =EgovDateUtil.dayMinusToInt("yyyyMMdd", 1); int minusSevenDays =EgovDateUtil.dayMinusToInt("yyyyMMdd", 7); MjonMsgStatVO mjonMsgStatVO = new MjonMsgStatVO(); mjonMsgStatVO.setStatStartDate(minusSevenDays); mjonMsgStatVO.setStatEndDate(minusDate); // 전일 문자발송 건 통계 insert mjonMsgService.insertAgentSmsCountStat(mjonMsgStatVO); //================================================================ //================================================================ MjonKakaoAtStatVO kakaoAtStatVO = new MjonKakaoAtStatVO(); kakaoAtStatVO.setStatStartDate(minusSevenDays); kakaoAtStatVO.setStatEndDate(minusDate); // 전일 알림톡발송 건 통계 insert kakaoStatisticsService.insertKakaoAtCountStat(kakaoAtStatVO); //================================================================ //================================================================ FaxStatVO faxStatVO = new FaxStatVO(); faxStatVO.setStatStartDate(minusSevenDays); faxStatVO.setStatEndDate(minusDate); // 전일 알림톡발송 건 통계 insert faxAdmService.insertFaxCountStat(faxStatVO); // do something... }catch(Exception ex) { ex.printStackTrace(); } } // AGENT별 SMS LMS MMS 발송건수 통계 스케쥴러 // @Scheduled(cron = "0 */10 * * * *") //10분마다 실행(TEST) // @Scheduled(cron = "0 0 1 * * *") // 매일 새벽1시 실행 @Scheduled(cron = "0 */30 * * * *") // 30분마다 실행 @SchedulerLock(name = "insertAgentSmsCountStat", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void agentSmsCountStatInsert2() throws Exception { // agent별 sms lms mms 발송건수 통계 데이터 upsert //System.out.println("insertAgentSmsCountStat scheduler RUN (EVERY 30 MINUTES)"); //int nowDate =EgovDateUtil.nowDateToInt("yyyyMMdd"); // int minusDate =EgovDateUtil.dayMinusToInt("yyyyMMdd", 1); // 당일 문자발송 건 통계 insert //MjonMsgStatVO mjonMsgStatVO = new MjonMsgStatVO(); //mjonMsgStatVO.setStatStartDate(nowDate); //mjonMsgStatVO.setStatEndDate(nowDate); //mjonMsgService.insertAgentSmsCountStat(mjonMsgStatVO); try { System.out.println("=============EgovSysLogScheduling=====agentSmsCountStatInsert2 =============>"); int nowDate =EgovDateUtil.nowDateToInt("yyyyMMdd"); // int minusDate =EgovDateUtil.dayMinusToInt("yyyyMMdd", 1); // 당일 문자발송 건 통계 insert MjonMsgStatVO mjonMsgStatVO = new MjonMsgStatVO(); mjonMsgStatVO.setStatStartDate(nowDate); mjonMsgStatVO.setStatEndDate(nowDate); mjonMsgService.insertAgentSmsCountStat(mjonMsgStatVO); //================================================================ //================================================================ MjonKakaoAtStatVO kakaoAtStatVO = new MjonKakaoAtStatVO(); kakaoAtStatVO.setStatStartDate(nowDate); kakaoAtStatVO.setStatEndDate(nowDate); // 당일 알림톡발송 건 통계 insert kakaoStatisticsService.insertKakaoAtCountStat(kakaoAtStatVO); //================================================================ FaxStatVO faxStatVO = new FaxStatVO(); faxStatVO.setStatStartDate(nowDate); faxStatVO.setStatEndDate(nowDate); // 전일 알림톡발송 건 통계 insert faxAdmService.insertFaxCountStat(faxStatVO); // do something... }catch(Exception ex) { ex.printStackTrace(); } } // 대시보드 어제/오늘 접속현황 & 접속통계 @Scheduled(cron = "0 1 0 * * *") // 매일 새벽0시 1분 실행 @SchedulerLock(name = "insertDashBoardStat", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void dashBoardStatInsert() throws Exception { try { System.out.println("=============EgovSysLogScheduling=====dashBoardStatInsert =============>"); // 어제날짜 Calendar calendar = new GregorianCalendar(); SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); String yesterdayDate = SDF.format(calendar.getTime()); calendar.add(Calendar.DATE, -1); yesterdayDate = SDF.format(calendar.getTime()); StatsVO yesterdayStatsVO = new StatsVO(); yesterdayStatsVO.setStatDate(yesterdayDate); // 대시보드 인서트 Logic conectStatsService.insertDashBoardStatLogic(yesterdayStatsVO); // 대시보드 업데이트 Logic conectStatsService.updateDashBoardStatLogic(yesterdayStatsVO); // 오늘날짜 Date nowDate = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String strNowDate = simpleDateFormat.format(nowDate); StatsVO statsVO = new StatsVO(); statsVO.setStatDate(strNowDate); // 대시보드 인서트 Logic conectStatsService.insertDashBoardStatLogic(statsVO); // 대시보드 업데이트 Logic conectStatsService.updateDashBoardStatLogic(statsVO); }catch(Exception ex) { ex.printStackTrace(); } } // 대시보드 어제/오늘 접속현황 & 접속통계 @Scheduled(cron = "0 */30 * * * *") // 30분마다 실행 @SchedulerLock(name = "updateDashBoardStat", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void DashBoardStatUpdate() throws Exception { try { System.out.println("=============EgovSysLogScheduling=====DashBoardStatUpdate =============>"); // 오늘날짜 Date nowDate = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String strNowDate = simpleDateFormat.format(nowDate); StatsVO statsVO = new StatsVO(); statsVO.setStatDate(strNowDate); // 대시보드 인서트 Logic conectStatsService.insertDashBoardStatLogic(statsVO); // 대시보드 업데이트 Logic conectStatsService.updateDashBoardStatLogic(statsVO); }catch(Exception ex) { ex.printStackTrace(); } } // 이용약관 메일발송 @Scheduled(cron = "0 */10 * * * *") // 10분마다 실행 @SchedulerLock(name = "sendTermsEmail", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void TermsEmailSend() throws Exception { try { System.out.println("=============EgovSysLogScheduling=====TermsEmailSend =============>"); // 이용약관 회원 전체발송 mjonNoticeSendUtil.userAllTermsEmailSend(); }catch(Exception ex) { ex.printStackTrace(); } } @Bean public LockProvider lockProvider(DataSource dataSource) { return new JdbcTemplateLockProvider(dataSource); } @Scheduled(cron = "20 * * * * ?") @SchedulerLock(name = "runKakaoOneTime", lockAtMostForString = ONE_MIN, lockAtLeastForString = ONE_MIN) public void runKakaoOneTime() throws Exception { // do something... try { System.out.println("=============SchedulerUtil=====runKakaoOneTime =============>"); schdlrManageService.kakaoFailPayBack(); }catch(Exception ex) { ex.printStackTrace(); } } //환불 실행 private void PayBack(String p_type) throws Exception { // 문자 환불 if ("ONE".equals(p_type)) { //하루에 한번만 31일 대상으로 실행 schdlrManageService.msgFailPayBackOneByDay(); }else { //2분 마다는 7일을 대상으로 실행 schdlrManageService.msgFailPayBack(); } System.out.println("==== faxFailPayBack ===="); // 팩스 환불 schdlrManageService.faxFailPayBack(); } }