洛阳网站建设的公司,设计网站一般要多少钱,做网站费用需要分摊吗,网络推广文案Quartz是实现了序列化接口的#xff0c;包括接口#xff0c;所以可以使用标准方式序列化到数据库。 而Spring2.5.6在集成Quartz时却未能考虑持久化问题。 Spring对JobDetail进行了封装#xff0c;却未实现序列化接口#xff0c;所以持久化的时候会产生NotSerializable问题包括接口所以可以使用标准方式序列化到数据库。 而Spring2.5.6在集成Quartz时却未能考虑持久化问题。 Spring对JobDetail进行了封装却未实现序列化接口所以持久化的时候会产生NotSerializable问题这也是网上一直在那边叫嚣为什么不能持久化到数据库问题哥今天看了下Spring源码发现Spring对Quartz持久化的问题. 1. 不知道Spring未来会不会对持久化的支持不过我们可以有如下解决方案比如改写 Spring的代码实现序列化接口. 2. 不使用Spring的Fatory,自己实现任务的初始化. 既然Spring不支持持久化那么持久化任务还是自己编写实现吧否则每次都需要打包发布麻烦自己编写的类与Quartz完全兼容. 注意:为什么Spring不支持外配置任务可能也是考虑到这方面问题所以才不提供这些任务的执行化支持.[配置文件配置与数据库配置重复] 直接使用Quartz是支持序列化功能比如直接使用页面配置Quartz界面设置任务执行时间等属性。 通过配置实现的是不应该初始化到数据库否则直接在数据库中配置了。不过也是可以配置的通过改写JobDetailBean.代码如下: package org.frame.auth.service; import java.util.Map; import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.scheduling.quartz.DelegatingJob;
import org.springframework.scheduling.quartz.SchedulerFactoryBean; public class PersistentJobDetailBean extends JobDetail
implements BeanNameAware, InitializingBean { private static final long serialVersionUID -4389885435844732405L; private Class actualJobClass; private String beanName; /** * Overridden to support any job class, to allow a custom JobFactory * to adapt the given job class to the Quartz Job interface. * see SchedulerFactoryBean#setJobFactory */ public void setJobClass(Class jobClass) { if (jobClass ! null !Job.class.isAssignableFrom(jobClass)) { super.setJobClass(DelegatingJob.class); this.actualJobClass jobClass; } else { super.setJobClass(jobClass); } } /** * Overridden to support any job class, to allow a custom JobFactory * to adapt the given job class to the Quartz Job interface. */ public Class getJobClass() { return (this.actualJobClass ! null ? this.actualJobClass : super.getJobClass()); } /** * Register objects in the JobDataMap via a given Map. * pThese objects will be available to this Job only, * in contrast to objects in the SchedulerContext. * pNote: When using persistent Jobs whose JobDetail will be kept in the * database, do not put Spring-managed beans or an ApplicationContext * reference into the JobDataMap but rather into the SchedulerContext. * param jobDataAsMap Map with String keys and any objects as values * (for example Spring-managed beans) * see SchedulerFactoryBean#setSchedulerContextAsMap */ public void setJobDataAsMap(Map jobDataAsMap) { getJobDataMap().putAll(jobDataAsMap); } /** * Set a list of JobListener names for this job, referring to * non-global JobListeners registered with the Scheduler. * pA JobListener name always refers to the name returned * by the JobListener implementation. * see SchedulerFactoryBean#setJobListeners * see org.quartz.JobListener#getName */ public void setJobListenerNames(String[] names) { for (int i 0; i names.length; i) { addJobListener(names[i]); } } public void setBeanName(String beanName) { this.beanName beanName; } public void afterPropertiesSet() { if (getName() null) { setName(this.beanName); } if (getGroup() null) { setGroup(Scheduler.DEFAULT_GROUP); } } } 这里把Spring的ApplicationContext去掉了因为这个属性没有实现序列化接口。其他配置与原告一致: ?xml version1.0 encodingUTF-8?
!DOCTYPE beans PUBLIC -//SPRING//DTD BEAN//EN http://www.springframework.org/dtd/spring-beans.dtd
beans default-autowirebyName bean iddataSource classorg.springframework.jdbc.datasource.DriverManagerDataSource destroy-methodclose property namedriverClassName valuecom.mysql.jdbc.Driver/ property nameurl value![CDATA[jdbc:mysql://localhost:3306/txl?connectTimeout1000useUnicodetruecharacterEncodingutf-8]]/value /property property nameusername valueroot/ property namepassword value/ /bean bean idjobDetail class org.frame.auth.service.PersistentJobDetailBean property namejobClass valueorg.frame.auth.service.PersistentJob/property /bean !-- bean idtrigger classorg.springframework.scheduling.quartz.SimpleTriggerBean --
!-- property namejobDetail refjobDetail/property--
!-- property namestartDelay value1000/property--
!-- property namerepeatInterval value3000/property--
!-- property namejobDataAsMap--
!-- map--
!-- entry keymessage valuethis is trigger/entry--
!-- /map--
!-- /property--
!-- /bean-- bean idcronTrigger classorg.springframework.scheduling.quartz.CronTriggerBean property namejobDetail refjobDetail/ property namecronExpression value0/10 * * * * ?/value /property /bean bean idschedulerFactory classorg.springframework.scheduling.quartz.SchedulerFactoryBean property namedataSource refdataSource/property property nameapplicationContextSchedulerContextKey valueapplicationContextKey / property nameconfigLocation valueclasspath:quartz.properties/ /bean /beans org.frame.auth.service.PersistentJob这个类很简单如下: package org.frame.auth.service; import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException; public class PersistentJob implements Job { Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println(spring quartz!); } } 有人可能会说你这种任务调度持久化就没有意义了是的一般持久化到数据库的代码如下: package org.frame.auth.service; import java.util.Map; import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob; public class PersistentJob implements StatefulJob { Override public void execute(JobExecutionContext context) throws JobExecutionException { // TODO Auto-generated method stub Map map context.getJobDetail().getJobDataMap(); System.out.println([context.getJobDetail().getName()]map.get(message)); map.put(message, updated Message); } } 这样的话信息message就会持久化到数据库中了.可以建立系统的连锁调度这根据你的业务需求了. 在Spring中配置的任务通过我这种修改是可以运行不过每次运行都需要把原先的任务删除否则会提示任务已经存在Quartz的优势是就算服务器停止下次重启能够恢复原先的任务并继续执行.