From b9c7210d786cbf1a2b8661f792c648e914382412 Mon Sep 17 00:00:00 2001 From: MaxKey Date: Thu, 14 Apr 2022 11:57:22 +0800 Subject: [PATCH] Jobs --- .../online/AbstractOnlineTicketService.java | 4 +- .../authn/online/OnlineTicketService.java | 5 + .../main/java/org/maxkey/MaxKeyMgtJobs.java | 140 ++++++++---------- .../java/org/maxkey/MaxKeyMgtMvcConfig.java | 8 - .../org/maxkey/jobs/AbstractScheduleJob.java | 19 +++ .../org/maxkey/jobs/AccountsStrategyJob.java | 41 +++-- .../org/maxkey/jobs/DynamicGroupsJob.java | 40 +++-- .../java/org/maxkey/jobs/DynamicRolesJob.java | 2 +- .../maxkey/jobs/OnlineTicketListenerJob.java | 36 ++++- .../contorller/LoginSessionController.java | 7 - 10 files changed, 157 insertions(+), 145 deletions(-) create mode 100644 maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AbstractScheduleJob.java diff --git a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/AbstractOnlineTicketService.java b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/AbstractOnlineTicketService.java index 2b24f98c7..d2cb1d5d5 100644 --- a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/AbstractOnlineTicketService.java +++ b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/AbstractOnlineTicketService.java @@ -46,8 +46,8 @@ public class AbstractOnlineTicketService implements OnlineTicketService{ private static final String HISTORY_LOGOUT_UPDATE_STATEMENT = "update mxk_history_login set logouttime = ? ,sessionstatus = 7 where sessionid = ?"; - - public List query() { + @Override + public List queryOnlineTicket() { List listOnlineTicket = jdbcTemplate.query( DEFAULT_DEFAULT_SELECT_STATEMENT, new OnlineTicketRowMapper()); diff --git a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/OnlineTicketService.java b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/OnlineTicketService.java index 1f64009e7..e4a414c8f 100644 --- a/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/OnlineTicketService.java +++ b/maxkey-authentications/maxkey-authentication-core/src/main/java/org/maxkey/authn/online/OnlineTicketService.java @@ -18,6 +18,9 @@ package org.maxkey.authn.online; import java.time.LocalTime; +import java.util.List; + +import org.maxkey.entity.HistoryLogin; public interface OnlineTicketService { @@ -33,5 +36,7 @@ public interface OnlineTicketService { public void setValiditySeconds(int validitySeconds); + public List queryOnlineTicket(); + public void terminate(String onlineTicket,String userId,String username); } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtJobs.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtJobs.java index e147ee84d..67135fa28 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtJobs.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtJobs.java @@ -17,13 +17,12 @@ package org.maxkey; +import org.maxkey.authn.online.OnlineTicketService; import org.maxkey.jobs.AccountsStrategyJob; import org.maxkey.jobs.DynamicGroupsJob; -import org.maxkey.persistence.repository.LoginHistoryRepository; -import org.maxkey.persistence.repository.LoginRepository; +import org.maxkey.jobs.OnlineTicketListenerJob; import org.maxkey.persistence.service.AccountsService; import org.maxkey.persistence.service.GroupsService; -import org.opensaml.xml.ConfigurationException; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; @@ -45,58 +44,78 @@ import org.springframework.scheduling.quartz.SchedulerFactoryBean; public class MaxKeyMgtJobs implements InitializingBean { private static final Logger _logger = LoggerFactory.getLogger(MaxKeyMgtJobs.class); - /** - * schedulerJobsInit. - * @return schedulerJobsInit - * @throws ConfigurationException - * @throws SchedulerException - */ - @Bean(name = "schedulerJobs") - public String schedulerJobs( - SchedulerFactoryBean schedulerFactoryBean, - GroupsService groupsService, - AccountsService accountsService, - @Value("${maxkey.job.cron.schedule}") String cronSchedule - ) throws SchedulerException { - _logger.debug("cron schedule : " + cronSchedule); + @Bean(name = "schedulerTicketListenerJobs") + public String ticketListenerJob( + SchedulerFactoryBean schedulerFactoryBean, + OnlineTicketService onlineTicketService) throws SchedulerException { - Scheduler scheduler = schedulerFactoryBean.getScheduler(); - - addDynamicGroupsJob( - DynamicGroupsJob.class, - scheduler, - groupsService, - cronSchedule, - "DynamicGroups" - ); - - addAccountsStrategyJob( - AccountsStrategyJob.class, - scheduler, - accountsService, - cronSchedule, - "AccountsStrategy" - ); - - return "schedulerJobs"; + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("service", onlineTicketService); + addJobScheduler( + OnlineTicketListenerJob.class, + schedulerFactoryBean, + jobDataMap, + "* 10 * * * ? ",//10 minutes + "TicketListener" + ); + + return "schedulerTicketListenerJobs"; } - - private void addDynamicGroupsJob( Class jobClass, - Scheduler scheduler , - GroupsService groupsService, + @Bean(name = "schedulerDynamicGroupsJobs") + public String dynamicGroupsJobs( + SchedulerFactoryBean schedulerFactoryBean, + GroupsService groupsService, + @Value("${maxkey.job.cron.schedule}") String cronSchedule + ) throws SchedulerException { + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("service", groupsService); + + addJobScheduler( + DynamicGroupsJob.class, + schedulerFactoryBean, + jobDataMap, + cronSchedule, + "DynamicGroups" + ); + + return "schedulerDynamicGroupsJobs"; + } + + @Bean(name = "schedulerAccountsStrategyJobs") + public String accountsStrategyJobs( + SchedulerFactoryBean schedulerFactoryBean, + AccountsService accountsService, + @Value("${maxkey.job.cron.schedule}") String cronSchedule + ) throws SchedulerException { + JobDataMap jobDataMap = new JobDataMap(); + jobDataMap.put("service", accountsService); + addJobScheduler( + AccountsStrategyJob.class, + schedulerFactoryBean, + jobDataMap, + cronSchedule, + "AccountsStrategy" + ); + + return "schedulerAccountsStrategyJobs"; + } + + private void addJobScheduler( Class jobClass, + SchedulerFactoryBean schedulerFactoryBean , + JobDataMap jobDataMap, String cronSchedule, String identity ) throws SchedulerException { + _logger.debug("Cron {} , Job schedule {} ", cronSchedule , identity ); + Scheduler scheduler = schedulerFactoryBean.getScheduler(); - _logger.debug("add DynamicGroups Job"); JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(identity + "Job", identity + "Group") .build(); - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("service", groupsService); + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronSchedule); CronTrigger cronTrigger = @@ -108,41 +127,6 @@ public class MaxKeyMgtJobs implements InitializingBean { scheduler.scheduleJob(jobDetail,cronTrigger); } - - private void addAccountsStrategyJob(Class jobClass, - Scheduler scheduler , - AccountsService accountsService, - String cronSchedule, - String identity - ) throws SchedulerException { - - _logger.debug("add Accounts Strategy Job"); - JobDetail jobDetail = - JobBuilder.newJob(jobClass) - .withIdentity(identity + "Job", identity + "Group") - .build(); - - JobDataMap jobDataMap = new JobDataMap(); - jobDataMap.put("service", accountsService); - - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronSchedule); - CronTrigger cronTrigger = - TriggerBuilder.newTrigger() - .withIdentity("trigger" + identity, identity + "TriggerGroup") - .usingJobData(jobDataMap) - .withSchedule(scheduleBuilder) - .build(); - - scheduler.scheduleJob(jobDetail,cronTrigger); - } - - public String SessionListenerJob( - SchedulerFactoryBean schedulerFactoryBean, - LoginRepository loginRepository, - LoginHistoryRepository loginHistoryRepository) { - - return "sessionListenerJob"; - } @Override public void afterPropertiesSet() throws Exception { diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java index bbf2a1c9e..abd7ad4a0 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/MaxKeyMgtMvcConfig.java @@ -36,7 +36,6 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @Configuration @@ -59,9 +58,6 @@ public class MaxKeyMgtMvcConfig implements WebMvcConfigurer { @Autowired HistoryLogsAdapter historyLogsAdapter; - @Autowired - LocaleChangeInterceptor localeChangeInterceptor; - @Autowired RestApiPermissionAdapter restApiPermissionAdapter; @@ -142,10 +138,6 @@ public class MaxKeyMgtMvcConfig implements WebMvcConfigurer { ; _logger.debug("add HistoryLogsAdapter"); - registry.addInterceptor(localeChangeInterceptor); - _logger.debug("add LocaleChangeInterceptor"); - - /* * api * idm diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AbstractScheduleJob.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AbstractScheduleJob.java new file mode 100644 index 000000000..52fb4733f --- /dev/null +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AbstractScheduleJob.java @@ -0,0 +1,19 @@ +package org.maxkey.jobs; + +import org.quartz.JobExecutionContext; + +public class AbstractScheduleJob { + + public final static class JOBSTATUS{ + public static int STOP = 0; + public static int RUNNING = 1; + public static int ERROR = 2; + public static int FINISHED = 3; + } + + protected int jobStatus = JOBSTATUS.STOP; + + + void init(JobExecutionContext context){}; + +} diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AccountsStrategyJob.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AccountsStrategyJob.java index 068c11860..f76dbd834 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AccountsStrategyJob.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/AccountsStrategyJob.java @@ -24,7 +24,7 @@ import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class AccountsStrategyJob implements Job , Serializable { +public class AccountsStrategyJob extends AbstractScheduleJob implements Job , Serializable { /** * @@ -35,40 +35,33 @@ public class AccountsStrategyJob implements Job , Serializable { private static AccountsService accountsService = null; - public static class JOBSTATUS{ - public static int STOP = 0; - public static int RUNNING = 1; - public static int FINISHED = 2; - } - - private static int jobStatus = JOBSTATUS.STOP; - @Override public void execute(JobExecutionContext context){ - if(jobStatus == JOBSTATUS.RUNNING) { - _logger.info("Accounts Strategy job is in running . " ); - return; - } + if(jobStatus == JOBSTATUS.RUNNING) {return;} - _logger.debug("Accounts Strategy job is running ... " ); + init(context); + + _logger.debug("Accounts Strategy Job running ... " ); jobStatus = JOBSTATUS.RUNNING; try { - if(accountsService == null) { - accountsService = - (AccountsService) context.getMergedJobDataMap().get("service"); - }else { + if(accountsService != null) { accountsService.refreshAllByStrategy(); - //10 minutes - Thread.sleep(10 * 1000); + Thread.sleep(10 * 1000);//10 minutes } - _logger.debug("Accounts Strategy job is success " ); + _logger.debug("Accounts Strategy Job finished " ); + jobStatus = JOBSTATUS.FINISHED; }catch(Exception e) { + jobStatus = JOBSTATUS.ERROR; _logger.error("Exception " ,e); - jobStatus = JOBSTATUS.STOP; } - jobStatus = JOBSTATUS.FINISHED; - _logger.debug("Accounts Strategy job is finished . " ); } + @Override + void init(JobExecutionContext context){ + if(accountsService == null) { + accountsService = + (AccountsService) context.getMergedJobDataMap().get("service"); + } + } } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicGroupsJob.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicGroupsJob.java index 2ef93bbca..c2e7579be 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicGroupsJob.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicGroupsJob.java @@ -24,7 +24,7 @@ import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class DynamicGroupsJob implements Job , Serializable { +public class DynamicGroupsJob extends AbstractScheduleJob implements Job , Serializable { /** * */ @@ -33,40 +33,34 @@ public class DynamicGroupsJob implements Job , Serializable { final static Logger _logger = LoggerFactory.getLogger(DynamicGroupsJob.class); private static GroupsService groupsService = null; - - public static class JOBSTATUS{ - public static int STOP = 0; - public static int RUNNING = 1; - public static int FINISHED = 2; - } - - private static int jobStatus = JOBSTATUS.STOP; @Override public void execute(JobExecutionContext context){ - if(jobStatus == JOBSTATUS.RUNNING) { - _logger.info("DynamicGroupsJob is in running . " ); - return; - } + if(jobStatus == JOBSTATUS.RUNNING) {return;} - _logger.debug("DynamicGroupsJob is running ... " ); + init(context); + + _logger.debug("DynamicGroups Job running ... " ); jobStatus = JOBSTATUS.RUNNING; try { - if(groupsService == null) { - groupsService = - (GroupsService) context.getMergedJobDataMap().get("service"); - }else { + if(groupsService != null) { groupsService.refreshAllDynamicGroups(); - Thread.sleep(10 *1000); + Thread.sleep(10 * 1000);//10 minutes } - _logger.debug("DynamicGroupsJob is success " ); + _logger.debug("DynamicGroups Job finished " ); + jobStatus = JOBSTATUS.FINISHED; }catch(Exception e) { + jobStatus = JOBSTATUS.ERROR; _logger.error("Exception " ,e); - jobStatus = JOBSTATUS.STOP; } - jobStatus = JOBSTATUS.FINISHED; - _logger.debug("DynamicGroupsJob is finished . " ); } + @Override + void init(JobExecutionContext context){ + if(groupsService == null) { + groupsService = + (GroupsService) context.getMergedJobDataMap().get("service"); + } + } } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicRolesJob.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicRolesJob.java index 604969a5e..f9a7a0e31 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicRolesJob.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/DynamicRolesJob.java @@ -17,6 +17,6 @@ package org.maxkey.jobs; -public class DynamicRolesJob { +public class DynamicRolesJob extends AbstractScheduleJob { } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/OnlineTicketListenerJob.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/OnlineTicketListenerJob.java index 9e1f93ade..7ac622008 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/OnlineTicketListenerJob.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/jobs/OnlineTicketListenerJob.java @@ -17,21 +17,53 @@ package org.maxkey.jobs; import java.io.Serializable; +import org.maxkey.authn.online.OnlineTicketService; +import org.maxkey.entity.HistoryLogin; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class OnlineTicketListenerJob implements Job , Serializable { +public class OnlineTicketListenerJob extends AbstractScheduleJob implements Job , Serializable { final static Logger _logger = LoggerFactory.getLogger(OnlineTicketListenerJob.class); private static final long serialVersionUID = 4782358765969474833L; + + OnlineTicketService onlineTicketService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { - // TODO Auto-generated method stub + if(jobStatus == JOBSTATUS.RUNNING) {return;} + init(context); + + _logger.debug("OnlineTicketListener Job is running ... " ); + jobStatus = JOBSTATUS.RUNNING; + try { + if(onlineTicketService != null) { + for (HistoryLogin onlineTicket : onlineTicketService.queryOnlineTicket()) { + if(onlineTicketService.get(onlineTicket.getSessionId()) == null) { + onlineTicketService.terminate( + onlineTicket.getSessionId(), + onlineTicket.getUserId(), + onlineTicket.getUsername()); + } + } + } + _logger.debug("OnlineTicketListener Job finished " ); + jobStatus = JOBSTATUS.FINISHED; + }catch(Exception e) { + jobStatus = JOBSTATUS.ERROR; + _logger.error("Exception " ,e); + } } + @Override + void init(JobExecutionContext context){ + if(onlineTicketService == null) { + onlineTicketService = + (OnlineTicketService) context.getMergedJobDataMap().get("service"); + } + } } diff --git a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/LoginSessionController.java b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/LoginSessionController.java index 60b90343e..701f011d9 100644 --- a/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/LoginSessionController.java +++ b/maxkey-webs/maxkey-web-mgt/src/main/java/org/maxkey/web/access/contorller/LoginSessionController.java @@ -25,8 +25,6 @@ import org.maxkey.authn.online.OnlineTicketService; import org.maxkey.entity.HistoryLogin; import org.maxkey.entity.Message; import org.maxkey.entity.UserInfo; -import org.maxkey.persistence.repository.LoginHistoryRepository; -import org.maxkey.persistence.repository.LoginRepository; import org.maxkey.persistence.service.HistoryLoginService; import org.maxkey.util.DateUtils; import org.maxkey.util.StringUtils; @@ -57,11 +55,6 @@ public class LoginSessionController { @Autowired HistoryLoginService historyLoginService; - @Autowired - LoginRepository loginRepository; - - @Autowired - LoginHistoryRepository loginHistoryRepository; @Autowired OnlineTicketService onlineTicketService;