幻境

We are extremely fortunate not to know precisely the kind of world we live in

Grails中使用Quartz定时读取RSS

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:

 

  1. class Post {   
  2.     String title   
  3.     String link   
  4.     String body   
  5. }  

 

 

  1. class Feed {   
  2.     String word   
  3.     String url   
  4. }  

 

其中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对象并储存在数据库中:

 

  1. class TechnoratiService {   
  2.     boolean transactional = false  
  3.     def parseAndSave(rss) {   
  4.         def rssObj = new XmlSlurper().parse(rss)   
  5.         rssObj.channel.item.each {   
  6.             def post = new Post(title: it.title.toString(),   
  7.                     link: it.link.toString(),   
  8.                     body: it.description.toString())   
  9.             post.save()   
  10.             println "Post [${post}] saved."  
  11.         }   
  12.     }   
  13. }  

 

之后让我们来生成定时执行的程序,你可以使用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,生成的类代码如下:

  1. class FeedParserJob {   
  2.     def concurrent = false  
  3.     def cronExpression = "0 0/5 * * * ?"  //每5分钟执行一次   
  4.        
  5.     def technoratiService   
  6.   
  7.     def execute() {   
  8.         def feedList = Feed.findAll()   
  9.         for (Feed feed : feedList) {   
  10.             println "Reading feed ${feed.word} @ ${feed.url}"  
  11.             technoratiService.parseAndSave(feed.url)   
  12.         }   
  13.     }   
  14. }  
之后就全部完成了。使用grails run-app启动你的服务器之后,向数据库中添加几个Feed条目,quartz插件就会每隔5分钟读取一次所有Feed中的地址并写入Post对象。
当然这只是一个非常简单的示例,实际上如果你希望写一个完整的阅读器还需要写更多代码,比如判断重复的条目等等。

 转贴自: http://www.ondev.net/post/show/592

阅读更多
个人分类: 编程相关
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭