Grails中你可以使用quartz插件来定时执行一个任务(如同unix上的crontab一样)。本文通过构建这样一个RSS阅读器的例子演示了这一功能。
首先创建一个grails应用:
grails create-app feedreader
cd feedreader
grails install-plugin quartz
grails create-domain-class Post
grails create-domain-class Feed
通过grails install-plugin quartz,grails会自动把quartz的包和配置下载到对应的项目中。之后编辑一下domain类Post和Feed:
- class Post {
- String title
- String link
- String body
- }
- class Feed {
- String word
- String url
- }
其中Feed类用来储存所要阅读的RSS地址,我们未来的自动阅读器将从数据库中读取Feed,然后根据其url属性去获取对应的内容并转化为Post对象。使用generate-all,grails会自动生成对Feed的CRUD操作页面:
grails generate-all Feed
之后如果你想往数据库中插入一个Feed对象可以用grails run-app将服务器启动以后访问对应的页面,默认地址应该是http://localhost:8080/feedreader/feed我们需要创建一个service类用来将Rss中的一个条目或者说Channel转化为Post对象并储存在数据库中:
- class TechnoratiService {
- boolean transactional = false
- def parseAndSave(rss) {
- def rssObj = new XmlSlurper().parse(rss)
- rssObj.channel.item.each {
- def post = new Post(title: it.title.toString(),
- link: it.link.toString(),
- body: it.description.toString())
- post.save()
- println "Post [${post}] saved."
- }
- }
- }
之后让我们来生成定时执行的程序,你可以使用create-job命令来创建一个定时执行的job类:
grails create-job FeedParser
你可以配置生成的类(本例中是FeedParser)的cronExpression属性指明应用服务器可以在什么时候执行这个job。cronExpression中的内容就如同unix下的cron配置一样。比如说:
def cronExpression = "0 0/5 * * * ?" //每5分钟执行一次
如果你不熟悉cron的格式,也可以定义一个triggers的closure,比如
static triggers = {
simpleTrigger startDelay:10000, timeout: 30000, repeatCount: 10
cronTrigger startDelay:10000, cronExpression: '0/6 * 15 * * ?'
customTrigger triggerClass:MyTriggerClass, myParam:myValue, myAnotherParam:myAnotherValue
}
在本例中我们使用cronExpression,生成的类代码如下:
- class FeedParserJob {
- def concurrent = false
- def cronExpression = "0 0/5 * * * ?" //每5分钟执行一次
- def technoratiService
- def execute() {
- def feedList = Feed.findAll()
- for (Feed feed : feedList) {
- println "Reading feed ${feed.word} @ ${feed.url}"
- technoratiService.parseAndSave(feed.url)
- }
- }
- }
当然这只是一个非常简单的示例,实际上如果你希望写一个完整的阅读器还需要写更多代码,比如判断重复的条目等等。
转贴自: http://www.ondev.net/post/show/592