在项目中,做动态定时任务的调度.通过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方法了.