package org.springside.examples.showcase.schedule; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler; import org.springframework.scheduling.support.CronTrigger; import org.springframework.util.Assert; import org.springside.examples.showcase.common.service.AccountManager; import org.springside.modules.utils.ThreadUtils; /** * 使用Spring的ThreadPoolTaskScheduler执行Cron式任务的类. */ public class SpringCronJob implements Runnable { private static Logger logger = LoggerFactory.getLogger(SpringCronJob.class); private String cronExpression; private int shutdownTimeout = Integer.MAX_VALUE; private ThreadPoolTaskScheduler threadPoolTaskScheduler; private AccountManager accountManager; @PostConstruct public void start() { Assert.hasText(cronExpression); threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setThreadNamePrefix("SpringCronJob"); threadPoolTaskScheduler.initialize(); threadPoolTaskScheduler.schedule(this, new CronTrigger(cronExpression)); } @PreDestroy public void stop() { ScheduledExecutorService scheduledExecutorService = threadPoolTaskScheduler.getScheduledExecutor(); ThreadUtils.normalShutdown(scheduledExecutorService, shutdownTimeout, TimeUnit.SECONDS); } /** * 定时打印当前用户数到日志. */ public void run() { long userCount = accountManager.getUserCount(); logger.info("There are {} user in database.", userCount); } public void setCronExpression(String cronExpression) { this.cronExpression = cronExpression; } /** * 设置gracefulShutdown的等待时间,单位秒. */ public void setShutdownTimeout(int shutdownTimeout) { this.shutdownTimeout = shutdownTimeout; } @Autowired public void setAccountManager(AccountManager accountManager) { this.accountManager = accountManager; } }