实时定时操作代码片段个人记录org.quartz.Job

本文只是实时定时操作代码片段个的人记录,以防遗忘!

JAVA中有需要用到定时的地方,但有时候需求并不是隔一段时间去自动执行,而是在确切的时间去执行,这就需要创建特定准确时间的定时任务.

一:Service中部分代码

1.需要调用创建任务的地方

//创建任务定时执行更新活动商品缓存
Date startSalesDate = DateUtil.StringToDate(selectSingleActivity.getStartSaleTime(), "yyyy-MM-dd HH:mm:ss");
this.createJobActivityProductCache(id+"", startSalesDate);//创建任务定时执行更新活动商品缓存


2.创建定时任务的方法

public void createJobActivityProductCache(String activityId, Date date) throws SchedulerException {
		Scheduler sched = null;
		boolean flag = false;
		try { 
			LOGGER.info("##############  定时更新活动商品缓存任务开始创建!");
			String dateFormat="ss mm HH dd MM ? yyyy"; 
			SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);  
			String formatTimeStr = null;  
			if (date != null) {  
				formatTimeStr = sdf.format(date);  
			}  
			sched= SpringContextHolder.getBean("schedulerFactoryBean");
			List<String> triggerGroupNames = sched.getTriggerGroupNames();
			for (int i = 0; i < triggerGroupNames.size(); i++) {
				if(triggerGroupNames.get(i).contains("Group_Activity_RefreshCache_"+activityId)){
					flag = true;
				}
			}
			//sched = StdSchedulerFactory.getDefaultScheduler();
			//sched = schedulerFactoryBean.getScheduler();
			TriggerKey triggerKey = TriggerKey.triggerKey("Job_Activity_RefreshCache_"+activityId, "Group_Activity_RefreshCache_"+activityId); 
			//Trigger trigger1 = sched.getTrigger(triggerKey);
			JobDetail job = JobBuilder.newJob(ActivityRefreshCacheQuartzJob.class).withIdentity("Job_Activity_RefreshCache_"+activityId, "Group_Activity_RefreshCache_"+activityId).build(); 
			//CronTrigger trigger1 = (CronTrigger) sched.getTrigger(triggerKey); 
			if (!flag) { 
				ScheduleJob scheduleJob = new ScheduleJob();
				scheduleJob.setJobName("Job_Activity_RefreshCache_"+activityId);
				scheduleJob.setJobGroup("Group_Activity_RefreshCache_"+activityId);
				scheduleJob.setSpringId(activityId);
				scheduleJob.setDesc("定时更新活动商品缓存任务创建立");
				job.getJobDataMap().put("scheduleRefreshCacheJob", scheduleJob);
				CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(CronScheduleBuilder.cronSchedule(formatTimeStr)).build(); 
				Date ft = sched.scheduleJob(job, trigger); 
				SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); 
				LOGGER.info(job.getKey() + " 已被安排执行于: " + sdf1.format(ft) + ",并且以如下重复规则重复执行: " + trigger.getCronExpression()); 
			}else{
				LOGGER.info("##############  定时任务已存在!");
				// Trigger已存在,那么更新相应的定时设置  
				CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(formatTimeStr);  
				// 按新的cronExpression表达式重新构建trigger  
				CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();  
				// 按新的trigger重新设置job执行  
				sched.rescheduleJob(triggerKey, trigger);
			}
			
			// 开始执行,start()方法被调用后,计时器就开始工作,计时调度中允许放入N个Job 
			if(!sched.isShutdown()){  
				sched.start();  
			}  
			//主线程等待一分钟 
			//Thread.sleep(60L * 1000L); 
		} catch (SchedulerException e) {
			LOGGER.error("##############  定时更新活动商品缓存任务创建立  错误 ", e);
		}    
	}

3.自动执行定时任务的JOB类 ActivityRefreshCacheQuartzJob

package com.pingan.zt.prms.web.scheduler;

import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.pingan.zt.prms.service.SalesActivityService;
import com.pingan.zt.prms.utils.DateUtil;
import com.pingan.zt.prms.utils.SpringContextHolder;
/**
 * 定时扫描开卖时间到了要更新活动商品缓存
 * 
 * @author WANGWENXIANG185
 *
 */
@DisallowConcurrentExecution
public class ActivityRefreshCacheQuartzJob implements Job{
	
	protected final Logger LOGGER = LoggerFactory.getLogger(ActivityRefreshCacheQuartzJob.class);

	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		//获取当前格式化时间
		String currentDate = DateUtil.getCurrentDate(DateUtil.DATE_PATTEN_FORMATTER1);
		LOGGER.info(currentDate+"开始执行更新活动商品缓存开始");
		SalesActivityService salesActivityService = (SalesActivityService) SpringContextHolder.getBean("salesActivityService");
	    ScheduleJob scheduleJob = (ScheduleJob)context.getMergedJobDataMap().get("scheduleRefreshCacheJob");
	    String id = scheduleJob.getSpringId();
	    LOGGER.info("时间=" + currentDate + " 执行了 1次"); // 1次
	    LOGGER.info("任务名称 = [" + scheduleJob.getJobName() + "]");
    	salesActivityService.updateActivityProductCache(Integer.parseInt(id));
    	LOGGER.info("定时更新活动商品缓存任务结束");
	}
	
}



上一篇:[Unity3d]u3d中定时器的使用


下一篇:【.Net MF新特性】Usb双接口支持