Quartz学习研究(开篇):解决Quartz中的空指针异常问题

本文探讨了在Spring环境中配置Quartz集群时遇到的NullPointerException问题及其解决方案,详细介绍了如何通过实现序列化接口来解决该问题,并提出了降低系统耦合度的设计建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、研究了quartz几天,问题发现不少,在全部配置好spring、quartz和mysql集群后,最后卡在一个空指针问题

[java]  view plain copy
  1. java.lang.reflect.InvocationTargetException  
  2.     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
  3.     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
  4.     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)  
  5.     at java.lang.reflect.Method.invoke(Method.java:597)  
  6.     at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:276)  
  7.     at com.telek.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.execute(MethodInvokingJobDetailFactoryBean.java:555)  
  8.     at org.quartz.core.JobRunShell.run(JobRunShell.java:202)  
  9.     at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:534)  
  10. Caused by: java.lang.NullPointerException  

2、简要说下原因与解决过程

首先,在集群中我们是通过数据库来进行管理的,所以我们的定时任务与触发器规则都需要以流的形式序列化到数据库中,这样需要定时的类必须实现序列化接口Serializable,其中有的属性相关的类也要实现序列化接口,所以一旦有与数据库交互的操作并且通过spring进行托管注入管理了,在service、dao都需要实现序列化接口,但是我全部做好以后还是会出现这个异常问题,最后饶了一个大圈终于发现原来我的Dao层的类虽然实现了序列化接口,但是它继承的HibernateDaoSupport中的HibernateTemplate并没有实现序列化接口,所以在此处必须换一种形式:HibernateTemplate没有实现序列化接口,而SessionFactory是实现序列化接口的,在ManagerDao注入SessionFactory,通过SessionFactory获取HibernateTemplate,也就是下面这种形式

[java]  view plain copy
  1. public class ManagerDaoImpl implements ManagerDao implements Serializable{  
  2.   
  3.     /** 
  4.      *  
  5.      */  
  6.     private static final long serialVersionUID = 1L;  
  7.     private SessionFactory sessionFactory;  
  8.   
  9.     public void saveManager(Manager manager) {  
  10.         HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);  
  11.         hibernateTemplate.save(manager);  
  12.     }  
  13.   
  14.     public SessionFactory getSessionFactory() {  
  15.         return sessionFactory;  
  16.     }  
  17.   
  18.     public void setSessionFactory(SessionFactory sessionFactory) {  
  19.         this.sessionFactory = sessionFactory;  
  20.     }  
  21.   
  22. }  

3、问题解决了,但是同时新的问题产生了,在集群服务宕机的情况下,报出了sessionFactory为null的错误,最后解决:在spring配置文件中加一句话(具体的话忘记了,想起来了再回来补)。
4、其实这种方式个人认为不理想,因为这样只要用到定时器的部分都需要去修改源代码了,这样高耦合度在开发中是不可取的。所以后面经过研究思考,有了另外一种方式,将定时器与数据库的交互操作分离开来,也就是一开始就将需要的bean放在bean池中,在具体调用的方法中再从bean池中获取,这样就做到了定时器与数据库交互的分离设计,而对于开发人员来说要做的也只是配置一些简单的定时操作即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值