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

简介: 本文只是实时定时操作代码片段个的人记录,以防遗忘! JAVA中有需要用到定时的地方,但有时候需求并不是隔一段时间去自动执行,而是在确切的时间去执行,这就需要创建特定准确时间的定时任务. 一:Service中部分代码 1.需要调用创建任务的地方 //创建任务定时执行更新活动商品缓存Date startSalesDate = DateUtil.StringToDate(select

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

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("定时更新活动商品缓存任务结束");
	}
	
}



目录
相关文章
|
17天前
|
存储 Java 调度
Sppring集成Quartz简单案例详解 包括(添加、停止、恢复、删除任务、获取下次执行时间等)
Sppring集成Quartz简单案例详解 包括(添加、停止、恢复、删除任务、获取下次执行时间等)
20 2
|
6月前
|
小程序 调度 数据库
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
quartz(二)动态增删改查停止启用job
quartz(二)动态增删改查停止启用job
63 0
|
XML SQL Java
Flowable 设置任务处理人的四种方式
Flowable 设置任务处理人的四种方式
1030 1
|
XML Java 数据格式
Flowable 服务任务执行的三种方式
Flowable 服务任务执行的三种方式
1318 0
|
分布式计算 关系型数据库 MySQL
Job 作业的使用--创建、查看、执行、删除 | 学习笔记
快速学习 Job 作业的使用--创建、查看、执行、删除
384 0
Job 作业的使用--创建、查看、执行、删除 | 学习笔记
|
测试技术 调度
Quartz传递数据和有无状态Job(三)
Quartz传递数据和有无状态Job(三)
271 0
Quartz传递数据和有无状态Job(三)
Quartz传递数据和有无状态Job(三)下
Quartz传递数据和有无状态Job(三)下
304 0
Quartz传递数据和有无状态Job(三)下
|
数据库 调度
【Quartz】问题记录注意事项【四】
原文:【Quartz】问题记录注意事项【四】 记录一:queartz 在同时启动多个任务是,触发器名称不能设置一致,不然第二次启动会不成功   记录二:quartz 在使用任务与触发器分离写法时,任务必须要带(.
1194 0
quartz获取定时任务下次执行的时间
quartz很多人都会用,但需要配置cronExpression. 这个cronExpression很多技术人员都要配置,但很多情况,我们要知道这个cronExpression下次执行的时间是啥,让非技术人员很直观的看到下一个定时任务的执行时间。
3155 0