定时任务quartz配置
发布日期:2021-07-20 20:53:07 浏览次数:29 分类:技术文章

本文共 2980 字,大约阅读时间需要 9 分钟。

参考链接:

xml 配置:

注册trigger

......

注册task

com.star.demo.ProjectQuartzJobBean

注册自定义job

调度中心加入trigger

......
schedulerContextAsMap
......
......

 

作业类实例:

 

import java.lang.reflect.Method;import org.quartz.JobExecutionException;import org.quartz.PersistJobDataAfterExecution;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;import org.springframework.scheduling.quartz.QuartzJobBean;import org.quartz.DisallowConcurrentExecution;import org.quartz.JobExecutionContext;import common.Logger;/**	自定义的QuartzJobBean (作业类)*/@PersistJobDataAfterExecution@DisallowConcurrentExecutionpublic class ProjectQuartzJobBean extends QuartzJobBean implements ApplicationContextAware{	 protected final Logger logger = Logger.getLogger(getClass());  	    private String targetMethod;			    private String targetObject; 			    private ApplicationContext context;  	  	    @Override  	    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {  	        try {  	            logger.info("开始执行 :" + targetObject); // 每个节点都打印此日志,但只有一个节点会执行					            Object targetObj = context.getBean(targetObject);  	            Method m = null;  	  	            try {  	            	m = targetObj.getClass().getMethod(targetMethod, new Class[] {JobExecutionContext.class});  	                m.invoke(targetObj, new Object[] {context});	            } catch (Exception e) {  	                logger.error(e);  	            }  	        } catch (Exception e) {  	            throw new JobExecutionException(e);  	        }  	    }  	  	    public void setApplicationContext(ApplicationContext applicationContext) {  	        this.context = applicationContext;  	    }  	  	    public void setTargetObject(String targetObject) {  	        this.targetObject = targetObject;  	    }  	  	    public void setTargetMethod(String targetMethod) {  	        this.targetMethod = targetMethod;  	    }  }

 

Bean需要实现某个功能,但该功能必须借助于Spring容器才能实现,此时就必须让该Bean先获取Spring容器,然后借助于Spring容器实现该功能。为了让Bean获取它所在的Spring容器,可以让该Bean实现ApplicationContextAware接口。

Spring容器会检测容器中的所有Bean,如果发现某个Bean实现了ApplicationContextAware接口,Spring容器会在创建该Bean之后,自动调用该Bean的setApplicationContextAware()方法,调用该方法时,会将容器本身作为参数传给该方法——该方法中的实现部分将Spring传入的参数(容器本身)赋给该类对象的applicationContext实例变量,因此接下来可以通过该applicationContext实例变量来访问容器本身。

例如:

在CacheUtil中通过spring容器创建CacheManager实例

public class CacheUtils {	private static CacheManager cacheManager = ((CacheManager) SpringContextHolder.getBean("cacheManager"));}

 

转载地址:https://blog.csdn.net/liao0801_123/article/details/80509404 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring线程池ThreadPoolTaskExecutor的底层及阻塞队列
下一篇:java死锁与demo

发表评论

最新留言

能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月03日 21时18分02秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章