RSS
Search
-
Recent Posts
Recent Comments
- Cedric Vander on Lingoes 2.7: a good choice for english study
- stingh711 on Lingoes 2.7: a good choice for english study
- Lartiste on Lingoes 2.7: a good choice for english study
- sting on Lingoes 2.7: a good choice for english study
- Lartiste on Lingoes 2.7: a good choice for english study
Categories
- blogging (4)
- database (1)
- diary (8)
- emacs (1)
- english (10)
- evernote (2)
- free (7)
- grails (1)
- ipod (12)
- java (23)
- jedit (9)
- link (1)
- love (1)
- management (5)
- memo (9)
- movie (1)
- photography (15)
- powershell (1)
- productivity (7)
- reading (2)
- self-management (9)
- software (25)
- vim (4)
- web-develop (2)
- webutils (8)
Tags
ajax anki apple canon console d300s d3000 diary english evernote firefox fish G10 game google reader grails grd gtd info instapaper ipad iphone ipod java jedit love management maven java MJ mysql nikon photo photography plugin productivity quartz search engine spring srs tab touch up vim web wordpressArchives
Top Posts
My delicious
My Shares on Google Reader
Tag Archives: spring
Quartz in Spring memo: part 7
最终还是放弃了使用jdbc jobstore。如果使用了,spring提供的MethodInvokingJobDetailFactoryBean不能用,SimpleTriggerBean, CronTriggerBean都不能用。系统里面已经有好多地方都使用了。不可能再回头去改了。 不使用jdbc jobstore,唯一的坏处就是,对于不能在spring配置里面配置(即用户添加的)schedule,系统启动的时候需要手动把schedule加到quartz里面去。
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
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
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
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
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
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