我们是小公司新组建的一个开发团队,公司从我们开始从零做起。所以大家在项目的开发过程中有时候会遇到一些莫敏其妙的问题,搞得大家十分头痛.......-_-!
有的问题我们经过些时日也能解决,但有的问题我们至今不解决,类似这个《Quartz无故报错》。我们的问题积累了有一些,但一直没有记录一下。
So.....今天来写一篇。希望有遇到类似问题的朋友能帮我们解决问题,或是与我们分享经验。
项目中要用到任务调度的地方比较多。我们选择的是使用Quartz来解决这个问题。刚开始项目规模比较小,任务调度只有几个的时候是没有发生过什么异常。但随着后面项目规模的扩大与定时器的增加,在项目启动的时候抛出了一个莫名其妙问题。
Could not invoke method 'myMethod' on target object [xxx.xxx.QuartzXXX@3f4ve3] java.lang.ExceptionInInitializerError
QuartzXXX是ref的bean。
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="quartzXXX"/> <property name="targetMethod" value="myMethod"/> </bean>
myMethod方法在QuartzXXX中是肯定存在的,并且只要服务器重启就没问题了。-_-!
有想过是什么spring的bean加载顺序问题,调整配置文件的加载顺序让Quartz最后加载也没效果。
找了很多资料都没有找到相应的解决方法。然后这个问题就这样已重启服务器的方式解决了。
后面有一天看到robbin写的一篇文章《应该如何正确使用Quartz》虽然没有指出我们的问题解决办法但是我们决定更改我们的定时器。
由于项目中已经使用了webservice所以就打算用webservice的方式。通过一个Quartz服务器来调用webservice来实现任务的调度。
这样的做法确实完全避免了我们之前的错误,并且给我们的开发带来了不少的方便,大家不用每台机器都开启一个定时器在那边跑了(跑一下HQL一大堆,很烦人。),只要在QuartzServer登记一下IP就行了。
置于为什么会报Could not invoke method 这个错误,还是不懂发生的原因在哪里,换成现在的解决方案也没在追究这个问题了。