实时定时操作代码片段个人记录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("定时更新活动商品缓存任务结束");
	}
	
}



目录
相关文章
|
4月前
|
小程序 调度 数据库
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
jeecg-boot集成xxl-job调度平台,每秒/每分钟/手动都能执行成功,但是设置固定时间不触发?
|
4月前
|
SQL 分布式数据库 Apache
Flink问题之实现state定时输出如何解决
Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。本合集提供有关Apache Flink相关技术、使用技巧和最佳实践的资源。
quartz(二)动态增删改查停止启用job
quartz(二)动态增删改查停止启用job
47 0
|
XML SQL Java
Flowable 设置任务处理人的四种方式
Flowable 设置任务处理人的四种方式
|
分布式计算 关系型数据库 MySQL
Job 作业的使用--创建、查看、执行、删除 | 学习笔记
快速学习 Job 作业的使用--创建、查看、执行、删除
362 0
Job 作业的使用--创建、查看、执行、删除 | 学习笔记
Quartz传递数据和有无状态Job(三)下
Quartz传递数据和有无状态Job(三)下
295 0
Quartz传递数据和有无状态Job(三)下
|
测试技术 调度
Quartz传递数据和有无状态Job(三)
Quartz传递数据和有无状态Job(三)
260 0
Quartz传递数据和有无状态Job(三)
|
Java 调度 Spring
Quartz任务调度(4)JobListener分版本超详细解析
<div class="markdown_views"> <p>在<a href="http://blog.csdn.net/qwe6112071/article/details/50966660">《spring学习笔记(15)趣谈spring 事件:实现业务逻辑解耦,异步调用提升用户体验》</a>我们通过实例分析讲解了spring的事件机制,或许你会觉得其中的配置略显繁琐,
3554 0
|
分布式计算
Spark2.4.0源码分析之WorldCount 触发作业提交(二)
Final RDD作为参数,通过RDD.collect()函数触发作业提交
1360 0
|
数据库 调度
【Quartz】问题记录注意事项【四】
原文:【Quartz】问题记录注意事项【四】 记录一:queartz 在同时启动多个任务是,触发器名称不能设置一致,不然第二次启动会不成功   记录二:quartz 在使用任务与触发器分离写法时,任务必须要带(.
1186 0