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: java
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: [...]
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">
[...]
Grails很不错
最近帮别人写一个小的项目,因为要求开发速度。用java从头开始写实在是太慢了,django和rails我虽然碰过一点,不过没写过很完整的东西。在时间比较紧的时候,实在是没什么信心。Grails好歹我也是搞java的,spring和hibernate也都熟悉。所以决定先试试看。
ACID这个不用说,很简单,生成出来的gsp页面也比rails的好懂。Entity mapping,也比较容易。常用的几种已经support得很好了。Controller这层和rails,django都差不多。不过我还没搞清楚什么时候要用render,什么时候直接return,什么时候用redirect。Gsp和jsp差不多。还试了一下ajax,简单的例子很快就跑通了。
在折腾了大概一个星期的业余时间,基本上把这个小程序搞定了。如果换作用java做,估计一周也就够把框架搭起来,把一个类的acid跑通吧。
现在想想,java真是太笨重了。想想写一个简单的acid要多费功夫吧。而且要学习的东西实在太多了。Jsp,servlet,至少一个mvc框架,hibernate,spring,还有比如说像maven或者ant这样的build tool。所以,还是很希望grails可以好好的发展。毕竟有java的api在后面支持着,只要performance不差,bug也不那么多。还是会很有前途的。不过spring被vmware收购了,好像grails的前途有点不明朗啊。
接下来的一段时间,应该会把grails好好的学习一下。这里,推荐一下grails in action,例子简单清楚,比较连续完整,而且可以运行。
BTW,在开发里面还是遇到了几个问题。一个是one to one,我已经在另外一边设了belongsTo,但cascade save还是不work。One to many就没有问题。另外一个,在unit test里面,一调用domain类的save或者其他dao的方法,就会报错说xxx method is not applicable for domain xxx,但是在integration test里面就work正常。所以现在测dao的东西,我都只用integration test。还有一个就是,不能单独运行某个test case,每次测试都要把所有的test case都跑一遍。
为什么要用ajax的table?