Quartz是實現了序列化接口的,包括接口,因此可使用標準方式序列化到數據庫。
而Spring2.5.6在集成Quartz時卻未能考慮持久化問題。
Spring對JobDetail進行了封裝,卻未實現序列化接口,因此持久化的時候會產生NotSerializable問題,這也是網上一直在那邊叫囂爲何不能持久化到數據庫問題,哥今天看了下Spring源碼,發現Spring對Quartz持久化的問題.
1. 不知道Spring將來會不會對持久化的支持,不過咱們能夠有以下解決方案,好比改寫
Spring的代碼,實現序列化接口.
2. 不使用Spring的Fatory,本身實現任務的初始化.
既然Spring不支持持久化,那麼持久化任務仍是本身編寫實現吧,不然每次都須要打包發佈,麻煩,本身編寫的類與Quartz徹底兼容.
注意:爲何Spring不支持外配置任務,可能也是考慮到這方面問題因此纔不提供這些任務的執行化支持.[配置文件配置與數據庫配置重複]
直接使用Quartz是支持序列化功能,好比直接使用頁面配置Quartz界面,設置任務執行時間等屬性。
經過配置實現的是不該該初始化到數據庫,不然直接在數據庫中配置了。不過也是能夠配置的,經過改寫JobDetailBean.代碼以下:
java
這裏把Spring的ApplicationContext去掉了,由於這個屬性沒有實現序列化接口。其餘配置與原告一致: mysql
org.frame.auth.service.PersistentJob這個類很簡單,以下: spring
有人可能會說,你這種任務調度持久化就沒有意義了,是的,通常持久化到數據庫的代碼以下: sql
這樣的話,信息message就會持久化到數據庫中了.能夠創建系統的連鎖調度,這根據你的業務需求了.
在Spring中配置的任務經過我這種修改是能夠運行,不過每次運行都須要把原先的任務刪除,不然會提示任務已經存在,Quartz的優點是就算服務器中止,下次重啓可以恢復原先的任務並繼續執行.數據庫