SpringBoot定时任务
①注解方式
import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
@EnableScheduling
public class CronTask01 {
@Scheduled(cron = "0/5 * * * * ?")
public void cron(){
String date = DateUtil.format(new Date(),"HH:mm:ss");
System.out.println(date+"注解方式执行定时任务.....");
}
}
②接口实现方式
import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.Trigger;
import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.CronTask;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import java.util.Date;
@Component
@EnableScheduling
public class CronTask02 implements SchedulingConfigurer {
//引入springboot为定时任务自带的线程池对象
@Autowired
ThreadPoolTaskScheduler pool;
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
String cron = "0/5 * * * * ?";
//设置线程池数量为1
pool.setPoolSize(1);
//设置定时任务线程池
taskRegistrar.setTaskScheduler(pool);
taskRegistrar.addCronTask(() -> {
String s = DateUtil.format(new Date(), "HH:mm:ss");
System.out.println(s + "接口方式执行定时任务..........");
}, cron);
// taskRegistrar.addTriggerTask(() -> {
// String s = DateUtil.format(new Date(), "HH:mm:ss");
// System.out.println(s+"接口方式执行定时任务..........");
// }, triggerContext -> {
// CronTrigger trigger = new CronTrigger(cron);
// Date date = trigger.nextExecutionTime(triggerContext);
// return date;
// });
}
}
PS:开发时无论用哪种方式在本地都可以运行正常,但是一旦发布到服务器Tomcat下,定时任务会在设定时间执行两遍。一开始打印日志发现有多个线程在运行,但是把线程池数量设为1之后还会执行两遍,最后发现是Tomcat服务配置文件映射问题,配置文件为“**/tomcat/conf/server.xml”。为了启动后可以访问服务器上的图片,在外部建了一个文件夹存放图片,并在server.xml文件中添加如下配置(context节点):
<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t "%r" %s %b" prefix="localhost_access_log" suffix=".txt" />
<!-- <Context crossContext="true" docBase="/www/wwwroot/images" path="" reloadable="true" /> -->
</Host>
docBase表示图片存放位置,猜测因为映射关系导致服务运行两次,故把context节点删除之后定时任务正常执行一遍!
如果还想访问服务器图片只需在“**/tomcat/webapps”目录即war包所在目录下新建文件夹存放图片即可。