Tag Archives: spring

Quartz in Spring memo: part 7

最终还是放弃了使用jdbc jobstore。如果使用了,spring提供的MethodInvokingJobDetailFactoryBean不能用,SimpleTriggerBean, CronTriggerBean都不能用。系统里面已经有好多地方都使用了。不可能再回头去改了。 不使用jdbc jobstore,唯一的坏处就是,对于不能在spring配置里面配置(即用户添加的)schedule,系统启动的时候需要手动把schedule加到quartz里面去。

Posted in java, memo | Tagged , , | View Comments

How to register spring’s CustomDateEditor

CustomDateEditor的一个作用就是在spring的配置文件里面把string转成在注入时的Date。默认CustomDateEditor是没有注册的。那到底怎么样注册CustomDateEditor呢? 首先在配置文件里面声明一个CustomDateEditor,用构造函数的方式注入它需要的两个参数,一个是SimpleDateFormatter,还有一个boolean值。 1: <bean id="dateEditor" class="org.springframework.beans.propertyeditors.CustomDateEditor"> 2: <constructor-arg> 3: <bean class="java.text.SimpleDateFormat"> 4: <constructor-arg value="yyyy/MM/dd"/> 5: </bean> 6: </constructor-arg> 7: <constructor-arg value="true"/> 8: </bean> 然后再把这个bean加到spring的CustomEditorConfigurer里面。 1: <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> 2: <property name="customEditors"> 3: <map> 4: <entry key="java.util.Date"> 5: <ref local="dateEditor"/> 6: </entry> … Continue reading

Posted in java, memo | Tagged , | View Comments

Quartz in Spring memo: part 6

我试了一下,用spring的MethodInvokingJobDetailFactoryBean,然后在job class里面用到其他的spring的bean,那这个job details是不能被persist的,因为不能序列化。如果不用MethodInvokingJobDetailFactoryBean,那job class根本就不用在spring里面配置,所以也不能在job class里面引用spring的bean了。在quartz的文档里看到有一个办法,可以从job class里面拿到application context。 首先是在SchedulerFactoryBean的配置里面配置一下applicationContextSchedulerContextKey属性,然后在job class里面可以用如下的方法拿到(job class一定要实现quartz的job接口):ApplicationContext appContext = (ApplicationContext) context.getScheduler().getContext().get("applicationContext"); 代码如下: 1: <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 2: <property name="triggers"> 3: <list> 4: </list> 5: </property> 6: <property name="jobDetails"> 7: <list> 8: <ref local="myJobDetail"/> 9: </list> 10: </property> … Continue reading

Posted in java, memo | Tagged , , | View Comments

Quartz in Spring memo: part 5

这一部分记录的东西有点杂。 如何在job中使用从trigger传进来的数据。 如何在spring里面配置一个直接存进数据库的job。 如何让多个trigger重复使用同一个job。 第一个问题,要在job中使用从trigger传进来的数据,直接在job类里面,从context里面拿到mergedJobDataMap,就可以拿到trigger传进来的数据了。代码如下: 1: public void execute(JobExecutionContext context) throws JobExecutionException { 2: Map map = context.getMergedJobDataMap(); 3: } 第二个问题,在spring里面加上job details的bean,然后在SchedulerFactoryBean里面加进去即可: 1: <bean id="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailBean"> 2: <property name="jobClass" value="quartz.PersistentJob"/> 3: <property name="name" value="myjob"/> 4: <property name="group" value="jobs"/> 5: … … Continue reading

Posted in java, memo | Tagged , , | View Comments

Quartz in Spring memo: part 4

前面讲的都是静态的schedule,也就是说,这个schedule我预先已经知道了。所以,在spring里面直接配置就好了。但是很多时候,schedule是由用户自己添加的。这时候就不能在spring里面直接配了。 首先,我们在spring里面已经配置了一个叫schedulerFactory的SchedulerFactoryBean,要注意的是,它是一个factory bean,也就是说,在注入的时候,可以把它当作一个quartz的Scheduler类来使用。我们可以写如下一个SchedulerManager类,来管理用户自己添加的schedule。 1: import org.quartz.JobDetail; 2: import org.quartz.Scheduler; 3: import org.quartz.SchedulerException; 4: import org.quartz.Trigger; 5:  6: public class ScheduleManager { 7: private Scheduler scheduler; 8:  9: public void setScheduler(Scheduler scheduler) { 10: this.scheduler = scheduler; 11: } 12:  13: … Continue reading

Posted in java, memo | Tagged , , | View Comments

Quartz in Spring memo: part 3

这一部分记录一下如何在spring里面配置persistent schedule。 首先job class,有两种方法,一个是直接实现quartz的StatefulJob接口,另外一个还是使用spring的MethodInvokingJobDetailFactoryBean,但是要把concurrent属性设成true。 trigger和part 1里面的非persistent的保持一致。需要注意的是,如果quartz版本 >= 1.6,是不能使用spring提供的SimpleTriggerBean或者CronTriggerBean的。这一点在spring的SimpleTriggerBean和CronTriggerBean的java doc里面有提到。这时候需要使用quartz本身的SimpletTrigger或者CronTrigger。 然后就是SchedulerFactoryBean,要配置dataSource。这个dataSource就是spring里面配置的供dao层使用的dataSource。ScheduleFactoryBean配置的xml如下: 1: <bean id="schedulerFactory" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 2: <property name="triggers"> 3: <list> 4: </list> 5: </property> 6: <property name="dataSource" ref="dataSource"/> 7: <property name="configLocation" value="classpath:quartz.properties"/> 8: </bean> 还有几个重要的步骤。 建quartz的数据库表。可以在quartz的包里面找到对应数据库的初始化sql。 在classpath下面创建一个quartz.properties文件。因为dataSource已经在spring里面配置过了,所以在quartz.properties里面不需要再重复配置。里面需要配置的是threadPool,jobStore等等。这个properties·文件需要在scheduleFactory的spring配置文件里面配置。quartz.properties sample如下: 1: org.quartz.threadPool.class = … Continue reading

Posted in java, memo | Tagged , , | View Comments

Quartz in Spring memo: part 1

Spring里面,有两种方式配置一个job detail,一种是实现quartz的Job接口,然后在spring的配置文件里面用JobDetailBean。配置文件如下: <bean id="job" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="quartz.HelloJob"/> <property name="jobDataAsMap"> <map> <entry key="name" value="sting"/> </map> </property> </bean> 另外一种是直接使用MethodInvokingJobDetailFactoryBean。可以不用实现Job接口,普通的java类也可以作为job class。配置文件如下: <bean id="job" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="jobClass"/> <property name="targetMethod" value="execute"/> </bean> 然后配置一下trigger和schedule factory,配置文件如下: <bean id="myTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <property name="jobDetail" ref="job"/> <property name="startDelay" value="1000"/> … Continue reading

Posted in java, memo | Tagged , , | View Comments