使用场景,使用Queue列队插入日志;每日晚上清洗数据生成报表并发送邮件
方法一:使用ScheduledExecutorService和ConcurrentLinkedQueue写日志
package com.caipeng;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.springframework.transaction.annotation.Transactional;
/**
* 自启动,注意web.xml需要配置
*
* @author CaiPeng
*
*/
public class TaskJobTest implements ServletContextListener {
public static ConcurrentLinkedQueue<Map<String,Object>> temoQ = new ConcurrentLinkedQueue<Map<String,Object>>();
private ScheduledExecutorService newScheduledThreadPool = Executors.newScheduledThreadPool(2);
long initialDelay = 72000;
long period = 10000;
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("开启触发器");
initPmmlcache();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("关闭触发器");
}
private void initPmmlcache(){
System.out.println("自启动任务开始");
try {
Runnable command = new Runnable() {
@Override
public void run() {
taskProcess();
}
};
newScheduledThreadPool.scheduleAtFixedRate(command, initialDelay, period, TimeUnit.MILLISECONDS);
} catch (Exception e) {
System.out.println("自启动任务异常");
}
System.out.println("自启动任务结束");
}
/**
* 使用队列插入日志到数据库
*/
@Transactional
private void taskProcess(){
List<Map<String,Object>> processList = new ArrayList<Map<String,Object>>();
int i= 10000;
if(temoQ.size()>0){
int size = temoQ.size();
if(size < 10000) i = size;
while(i > 0){
processList.add(temoQ.poll());
i--;
}
if(processList.isEmpty()) return;
//写日志到数据库,具体方法自行补充
writeLog(processList);
}
}
}
<!-- web.xml添加 -->
<listener>
<listener-class>
com.caipeng.TaskJobTest
</listener-class>
</listener>
方法二:使用ServletContextListener和Job
package com.caipeng;
import java.util.Calendar;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
/**
* @TODO 定时任务控制类
*
*/
public class TaskJobCronTriggerTest implements ServletContextListener {
public static void runTest() {
try {
System.out.println("开始启动定时任务");
// 通过SchedulerFactory来获取一个调度器
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
// 引进作业程序
JobDetail jobDetail = new JobDetail("name", "group", TaskJobAction.class);
// 表示每天的1点执行,0/1 <=> *
//CronTrigger trigger = new CronTrigger("name", null, "0 0 1 * * ?");
// 测试:每分钟 => 每分钟的0秒
//CronTrigger trigger = new CronTrigger("name", null, "0 * * * * ?");
//每十秒执行一次
CronTrigger trigger = new CronTrigger("name", null, "0/10 * * * * ?");
Calendar cal = Calendar.getInstance();
trigger.setStartTime(cal.getTime());
// 作业和触发器设置到调度器中
scheduler.scheduleJob(jobDetail, trigger);
// 启动调度器
scheduler.start();
System.out.println("成功启动定时任务");
} catch (Exception e) {
e.printStackTrace();
System.out.println("启动定时任务失败!");
}
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
System.out.println("开启触发器");
runTest();
}
@Override
public void contextDestroyed(ServletContextEvent arg0) {
System.out.println("关闭触发器");
}
}
package com.caipeng;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* 描述:定时任务 实体执行类
*/
public class TaskJobAction implements Job {
/**
* 所有需要执行的定时任务,都要写在这个方法体内
*/
public void execute(JobExecutionContext arg0) throws JobExecutionException {
try {
System.out.println("开始执行定时任务");
long time = System.currentTimeMillis();
// 执行任务,可以是插入日志,统计报表等
// ApplicationContext context = org.springframework.web.context.ContextLoader.getCurrentWebApplicationContext();
// MyServiceI myService = (MyServiceI) context.getBean("myService");
// myService.run();
System.out.println("成功执行定时任务,耗时:"+(System.currentTimeMillis() - time)+"ms");
} catch (Exception e) {
e.printStackTrace();
System.out.println("执行定时任务异常");
}
}
}
<!--web.xml添加 -->
<listener>
<listener-class>
com.caipeng.TaskJobCronTriggerTest
</listener-class>
</listener>