與 數據庫 db 相關操作有兩種:
1.從DB中讀cronExpression
2.Job持久化到數據庫
對于1:
Quartz 在Spring中動態設置cronExpression
參考 小刀的blog
http://www.tkk7.com/xiaodaoxiaodao/articles/103437.html
通過DB加載cronException
一個類是可以的
2個類會出問題
<bean id="test2" class="cn.edu.hust.mes.service.quartz.Test">
<property name="scheduler" ref="schedulerFactoryBean"/>
</bean>
<bean id="test" class="Test">
<property name="scheduler" ref="schedulerFactoryBean"/>
</bean>
<bean name="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerForPLCRead"/>
<ref bean="cronTrigger"/>
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
<bean id="test2" class="cn.edu.hust.mes.service.quartz.Test">
<property name="scheduler" ref="schedulerFactoryBean"/>
</bean>
<bean id="test" class="Test">
<property name="scheduler" ref="schedulerFactoryBean"/>
</bean>
<bean name="schedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerForPLCRead"/>
<ref bean="cronTrigger"/>
</list>
</property>
<property name="configLocation" value="classpath:quartz.properties"/>
</bean>
Caused by:
org.springframework.beans.factory.BeanCurrentlyInCreationException:
Error creating bean with name 'schedulerFactoryBean': FactoryBean which
is currently in creation returned null from getObject
如果寫了攔截器的化 還會報這個錯 :
Error creating bean with name 'test2': Bean with name 'test2' has
been injected into other beans [schedulerJobDetailForPLCRead] in its
raw version as part of a circular reference, but has eventually been
wrapped (for example as part of auto-proxy creation). This means that
said other beans do not use the final version of the bean. This is
often the result of over-eager type matching - consider using
'getBeanNamesOfType' with the 'allowEagerInit' flag turned off, for
example.
對于2:
MethodInvokingJobDetailFactoryBean 不能持久化
必須用JobDetailBean 需繼承QuartzJobBean 不夠pojo
使用MethodInvokingJobDetailFactoryBean的化會報:
org.quartz.JobPersistenceException: Couldn't store job: Unable to
serialize JobDataMap for insertion into database because the value of
property 'methodInvoker' is not serializable:
org.springframework.scheduling.quartz.MethodInvoki
ngJobDetailFactoryBean [See nested exception:
java.io.NotSerializableException: Unable to serialize JobDataMap for
insertion into database because the value of property
API上說了
There's a note in the JavaDoc, I'd presume this might be your problem.
JobDetails created via this FactoryBean are not serializable and
thus not suitable for persistent job stores. You need to implement your
own Quartz Job as a thin wrapper for each case where you want a
persistent job to delegate to a specific service method.
http://www.springframework.org/docs/api/org/springframework/scheduling/quartz/MethodInvokingJobDetailFactoryBean.html
用MethodInvokingJobDetailFactoryBean不可持久化 除非加個thin wrapper
但查不到任何資料
但愿spring后續版本有好的方案 現在還是老老實實的用JobDetailBean吧
另:
不可用于web action action 用了session等作用域...
Caused by: java.lang.IllegalStateException: No thread-bound request
found: Are you referring to request attributes outside of an actual web
request? If you are actually operating within a web request and still
receive this message,your code is probably running outside of
DispatcherServlet/DispatcherPortlet: In this case, use
RequestContextListener or RequestContextFilter to expose the current
request.