现在的位置: 首页 > 综合 > 正文

WEB容器中启动就运行,查询数据库,管理定时任务调度

2014年09月05日 ⁄ 综合 ⁄ 共 1427字 ⁄ 字号 评论关闭

在项目中,做动态定时任务的调度.通过Quartz提供的API实现在页面配置.

由于在项目刚开启的时候,需要读取数据库获取哪些调度任务需要启动.所以在项目启动时就要去查询数据库.

在实践过程中,发现自己写的Spring获取Bean的帮助类老是报空指针.看了几篇博客,也没发现自己的问题.(实现ApplicationContextAware, DisposableBean接口)

后来我变换策略,想既然用ClassPathXmlApplicationContext自己加载没有问题,我何不自己做一个加载的工具类.

通过Listener获取在Web.xml中配置的路径

	public void contextInitialized(ServletContextEvent event) {
	 	contextLoader = createContextLoader();
		contextLoader.initWebApplicationContext(event.getServletContext());
		
		//获取在web.xml中配置的路径
		String path = event.getServletContext().getInitParameter( "contextConfigLocation");
		ApplicationContext context = SpringBeanUtils.init(path);
		initQuartzManager(context);
	}

/**
  *查询数据库中的数据
  **/
	public void initQuartzManager(ApplicationContext context){
		QuartzManagerService quartzManagerService = (QuartzManagerService) context.getBean("quartzManagerService");
		
		List<QuartzManager> quartzList = quartzManagerService.findByField(QuartzManager.PROP_STATUS, "1");
		
		for(QuartzManager quartz : quartzList){
			quartzManagerService.addJob(quartz,Log.class.getName() ,null);
		}
	}

然后通过单例的ApplicationContext

public class SpringBeanUtils {
	private static ApplicationContext context;

	//隐藏构造器
	private SpringBeanUtils(){}
	
	public static ApplicationContext init(String path){
		if(context == null){
			context = new ClassPathXmlApplicationContext(path);
		}
		return context;
	}
	
	public static Object getBean(String beanName){
		return context.getBean(beanName);
	}
	
	public static <T>T getBean(String beanName, Class<T> clazz){
		return (T) context.getBean(beanName, clazz);
	}
	
}

这样,后期就可以直接调用getBean方法了.

抱歉!评论已关闭.