Search My Blog
Loading
Pages
Categories
- database (1)
- diary (9)
- english (3)
- free (8)
- grails (1)
- ipod (10)
- java (21)
- link (1)
- love (1)
- management (3)
- memo (9)
- movie (1)
- photography (15)
- powershell (1)
- productivity (2)
- reading (1)
- self-management (7)
- software (19)
- status (2)
- web-develop (1)
- webutils (4)
- wordpress (4)
Tags
500d ajax blog canon console d300s d3000 d5000 diary english firefox fish G10 game google reader grails grd info instapaper ipad iphone ipod java jedit love management MJ mysql nikon photo photography plugin productivity quartz search engine software spring tab taobao target touch up web wordpress zoundryArchives
-
Recent Comments
My Shares on Google Reader
Tag Archives: quartz
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: [...]
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"/>
[...]
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 [...]
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>
[...]
Quartz in Spring memo: part 2
关于Persistent schedule,如果数据库里面已经有相同name,groupName的job了,再加一个,会报错。问题是,对于常驻后台的schedule,如果重启,还要去判断是不是已经有同样名字的job。还不如每次启动都加一个非persistent的schedule。比如说下面的代码,如果不对t和j做是否null的判断,在重复运行的时候,就会在第12行抛错。
1: SchedulerFactory sf = new StdSchedulerFactory();
2: Scheduler s = sf.getScheduler();
3: s.start();
4:
5: Trigger t = s.getTrigger("myTrigger", "triggers");
6: JobDetail j = s.getJobDetail("myJob", "jobs");
7: if (t == null && j == null) {
[...]
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">
[...]
Quartz in Spring memo: part 7