首页 / 软件开发 / JAVA / 利用Grails搭建Feedlr.com网站
利用Grails搭建Feedlr.com网站2011-06-21 infoq 侯雍容Feedlr:feed驱动的多平台微博客机器人平台微博客是由Twitter 创造出的一种web 2.0时代的新事物。在微博客上,人们 使用简短的语言随时随地的发表消息,并可以即时地受到好友的消息。由于易用 ,实时等特点,Twitter在06年推 出至今逐步升温,已经拥有超过300万用户。 特别在08年中,Twitter一改起步阶段geek玩具的角色,明显地向主流进化。随 着Twitter的兴 起,也出现了非常多其他的微博客。仅国内就有叽歪、饭否、以 及做啥等等。微博客的兴起提供了一种全新的在线沟通方式。Twitter作为微博客的 鼻祖和最成功的例子,其优秀的API接口功不可没。通 过Twitter API,开发者们开发出了众多新奇又好用的Twitter第三方应用。我开 发Feedlr的出发点是建立一个让用户可以自行定制feed机器人的服务,核 心功 能类似Twitter上颇受欢迎的twitterfeed,并且可以同时Twitter,叽歪,饭否 以及做啥共4种微博客平台。通过 Feedlr,用户可以建立微博客广播帐号,来随时追踪自己感兴趣的 RSS/Atom Feed内容。一旦有更新,Feedlr就会自动把新的内容发送到指定的微 博客平台上。Feedlr上线至今,用户们建立了自定义的新闻播报机器 人,DIY的 免费天气预报机器人,不同微博客之间的消息同步机器人,甚至国内地震情况实 时监控机器人等等。而通过国内微博客服务的短信通知服务,以上所有 的Feed 内容国内用户都可以免费在手机上通过短信接收到。Grails框架的选择Grails是一个崭露头角的基于 Groovy语言,运行与JVM之上,设计上类似于 Rails的快速web开发框架,在08年初刚推出1.0版。通过Groovy语言和创新的架 构,Grails把成熟的企业级JEE开源组件Spring,Hibernate等巧妙地整合起来, 使用类似Rails的“按约定设计”(design by convention)理念捆绑成一套完整 的web开发框架。JEE开发过程的繁琐被Groovy灵活多变的动态特性和按约定设计 带来的精简配置所取代, 而又保留了企业级组件在稳定和性能方面的优势,可 以说是把Rails式的快速开发带给了水深火热中的JEE开发者们。我来自JEE背景 ,对Groovy语 言也有一定基础,选用Grails搭建Feedlr是比较自然的选择,同 时也是为了在一个没有过多约束的真实项目中体验Grails的完整开发过程。如何用Grails实现Feedlr的核心功能Feedlr的核心功能Feedlr的核心功能主要包括定时查询用户提供的feed的更新,把更新的feed 内容发布到微博客,再加上用来增强用户体验的多处AJAX实现以及OpenID登录等 。这里逐一对这些功能的实现做一下介绍。定时查询feed更新Feedlr 最核心的功能就是定时轮询用户提交的feed,发现新增的条目,从而 通过微博客API发送到微博上去。只要使用Grails的Quartz插件就可以非常 方便 的实现这一功能。Quartz是一个用途广泛的开源Java库,用于精确地控制定时任 务。由于兼容Unix Cron语法,Quartz的功能非常强大。而在Grails中,Quartz 是框架自带的核心插件之一,通过Quartz插件来执行定时任务非常方便。 新建 一个Quartz定时任务,只需要在Grails项目根目录下执行grails create-job根 据提示输入job名称,Grails就会自动在grails-app/jobs/目录下生成一 个新的job程序文件。Grails job都是以XXXJob.groovy命名,存放在grails- app/jobs目录下,Grails启动时会自动遍历jobs目录,定时执行每个定 义好的 job。一个job文件用来定义一种定时执行模式,通过Unix Cron语法来定义定时 逻辑。例如,Feedlr用于轮询feed的job大致是这样的:class UpdateFeedsJob {
def feedService
def cronExpression = "0 * * * * ?" //每分钟执行一次
def execute() {
feedService.updateFeeds()
}
}Cron 表达式“0 * * * * ?”表示每分钟执行一次。需要执行的逻辑通过定 义一个execute()方法来指定。其中feedService是已经定义好的用来查询feed更 新的一 个Grails Service类,使用Rome来解析feed。注意此处不需要实例化 feedService变量,只要通过按约定设计的规则定义需要使用的 Service的变量 名,Grails会自动找到FeedService这个Service类,注入到UpdateFeedsJob中, 并把 Service实例付给feedService变量,听起来很神奇吧。这样,Grails就会 每分钟触发一次UpdateFeedsJob,来查询 feed更新了。