您的位置:首页 > 编程语言 > Java开发

解决Quartz的Job类中使用注解Service为null的办法

2017-10-23 11:18 519 查看
最近项目中有个需求,需要周期性的执行一个事件,决定使用Quartz这个工具去实现。项目需求是,网页上点击运行按钮,就开始周期性的执行某一事件,然后每次执行将数据插入到数据库中。

项目的环境是SSM框架,spring4.3,Quartz1.6版本,Intellij IDEA 2017.1

遇到的问题是:在java project中使用quartz1.6版本和quartz2.3版本一切正常,正高兴的将这个java project中的代码移植到web工程之后,问题就来了。

1、首先,版本问题,我们的web工程里面已经有人使用maven集成了quartz1.6,但我想用的是2.3版本啊,最后折腾半天,我这边能用2.3版本,他那边又会报错;我用1.6版本,我这边2.3的一些Quartz的新方法全都不能用,没办法,最后我妥协了,用1.6版本。

2、1.6版本的代码写好了之后,quartz也能跑起来了,但我在implements Job的类的execute方法中使用@Autowired XXXService时候,一直提示XXXService为空,很郁闷啊

原先代码如下,一直报出xxxService为空

public class XXXJob implements Job{
@AutoWired
XXXService xxxService;
@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException{
System.out.println(xxxService.getResult());
}
}


随后同事说在非spring容器里面调用service的方法需要使用工具类获取service,ApplicationContext.getBean(“xxxService”)

然后写了工具类之后,又报出no bean named ‘xxxService’ available,没脾气,还是获取不到这个service,再去网上搜索Quartz的Job类中如何使用service,搜了一大堆相同的方法,比如什么配置AdaptableJobFactory,试了都没有用,还是报错。最后根据下面两个博客的内容整合之后,可以使用service了。

如何在Java Filter 中注入 Service

ServletContextListener使用

最后代码如下:

QuartzServletContextListener 代码如下:

public class QuartzServletContextListener extends QuartzInitializerListener {

public static final String MY_CONTEXT_NAME = "servletContext";

@Override
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
super.contextDestroyed(sce);
}

@Override
public void contextInitialized(ServletContextEvent sce) {
// TODO Auto-generated method stub
super.contextInitialized(sce);
ServletContext servletContext = sce.getServletContext();
StdSchedulerFactory factory = (StdSchedulerFactory) servletContext
.getAttribute(QuartzInitializerListener.QUARTZ_FACTORY_KEY);
try {
factory.getScheduler().getContext()
.put(QuartzServletContextListener.MY_CONTEXT_NAME, servletContext);
} catch (SchedulerException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


将QuartzServletContextListener 配置到web.xml中去

<listener>
<listener-class>x.x.x.QuartzServletContextListener</listener-class>
</listener>


XXXJob的代码如下:

public class XXXJob implements Job{
@Override
public void execute(JobExecutionContext jobContext) throws JobExecutionException{
try {
ServletContext context = null;
try {
context = (ServletContext) jobContext.getScheduler().getContext()
.get(QuartzServletContextListener.MY_CONTEXT_NAME);
} catch (SchedulerException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
XmlWebApplicationContext cxt = (XmlWebApplicationContext)WebApplicationContextUtils.getWebApplicationContext(context);
XXXService xxxService = (XXXService)cxt.getBean("XXXService");
System.out.println(xxxService.getResult());
}
}


最后完美,总算不报错了,也可以在Job中使用service了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  quartz spring idea
相关文章推荐