首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

用 Grails 打造 Feedlr:多平台微博客機器人平台的開發實戰

     編輯:Java 相關知識

前言:微博客時代的來臨與 Feedlr 的誕生

微博客作為 Web 2.0 時代的產物,由 Twitter 開創,讓人們能以簡短文字即時分享生活點滴、接收好友動態。Twitter 憑藉易用性與實時性,從 2006 年推出至今用戶已超過 300 萬,並在 2008 年邁向主流。國內隨之湧現叽歪、飯否、做啥等平台,微博客成為全新的線上溝通方式。

Twitter 的成功離不開開放的 API,催生了大量第三方應用。Feedlr 的初衷是建立一個讓用戶自行定制 Feed 機器人的服務,核心功能類似 Twitter 上熱門的 twitterfeed,但支援 Twitter、叽歪、飯否、做啥四大平台同步發布。用戶只需建立微博客廣播帳號,綁定感興趣的 RSS/Atom Feed,Feedlr 即會定時輪詢並自動推送更新內容至指定平台。上線以來,用戶創建了新聞播報、天氣預報、跨平台同步、甚至地震監控等機器人,配合國內微博客的短信通知,所有內容皆可免費經由手機短信接收。

技術選型:為何選擇 Grails?

Grails 是基於 Groovy 語言、運行於 JVM 之上、設計靈感源自 Rails 的快速 Web 開發框架,2008 年初釋出 1.0 版。它以 Groovy 的動態特性與「按約定設計」理念,將 Spring、Hibernate 等成熟 JEE 組件巧妙整合,以精簡配置取代繁瑣的 JEE 開發流程,卻保留企業級組件的穩定與性能優勢,可謂將 Rails 式快速開發帶給 JEE 開發者。筆者具備 JEE 背景且熟悉 Groovy,選用 Grails 構建 Feedlr 屬自然選擇,亦旨在真實專案中完整體驗 Grails 開發週期。

核心功能實現詳解

定時查詢 Feed 更新

Feedlr 最核心的功能是定時輪詢用戶提交的 Feed,發現新條目後經由微博客 API 發布。Grails 內建的 Quartz 插件讓此功能實現極為便捷。Quartz 是廣泛使用的開源 Java 排程庫,支援 Unix Cron 語法,功能強大。在 Grails 專案根目錄執行 grails create-job 即可於 grails-app/jobs/ 生成 Job 類,命名慣例為 XXXJob.groovy。啟動時 Grails 自動掃描該目錄並依 Cron 表達式定時執行。

例如輪詢 Feed 的 Job 如下:

class UpdateFeedsJob {
    def feedService
    def cronExpression = "0 * * * * ?" // 每分鐘執行一次
    def execute() {
        feedService.updateFeeds()
    }
}

此處 feedService 為已定義的 Service 類,採用 Rome 解析 Feed。得益於「按約定設計」,無需手動實例化,Grails 會自動注入對應的 Service 實例,每分鐘觸發一次輪詢。

發布 Feed 更新至微博客

主流微博客 API 均採 REST 風格,以 GET/POST 交互。以發布推文為例,需對 Twitter 指定 API 端點發送 POST 請求並附帶 HTTP Basic 認證。Groovy 代碼清晰易讀:

def conn = new URL('https://twitter.com/statuses/update.xml').openConnection()
conn.setRequestProperty('Authorization', 'Basic ' + 'username:password'.bytes.encodeBase64())
conn.requestMethod = 'POST'
conn.doOutput = true
try {
    conn.outputStream.withWriter('UTF8') { it << "status=" << newMessage }
} catch (Exception e) { /* 錯誤處理 */ }

encodeBase64() 為 Grails 提供的動態方法,同類還有 encodeAsURL() 等,極大簡化編碼操作。

AJAX 交互體驗

Web 2.0 少不了 AJAX,Grails 內建的 render 方法讓回應前端請求變得輕鬆:

  • 直接返回純文本:render("This is an Ajax response.")
  • 指定格式與編碼:render(text:"some xml", contentType:"text/xml", encoding:"UTF-8")
  • 返回模板:render(template:"feeds", model:[feeds:feeds], contentType:"text/html", encoding:"UTF-8")
  • 自動轉換物件為 JSON:render jsonObj as JSON
  • 使用 JSON Builder DSL 構造 JSON:render(contentType:'text/json', encoding:'UTF-8') { studio(name:'Pixar', website:'pixar.com') films { film(title:'Toy Story', year:'1995') ... } }

OpenID 登錄支援

Grails 社區提供 OpenID 插件,安裝極簡單:grails install-plugin openid。使用插件提供的 Taglib 編寫登錄表單:

<openid:form success="[controller:'login',action:'openidSuccess']" error="[controller:'login',action:'openidError']">
    <openid:input size="30" value="https://" class="input-text"/>
    ...
</openid:form>

插件處理驗證流程,登錄成功後在 Controller 可獲取 session.openidIdentifier。完整整合 OpenID 與傳統帳號仍需開發者自行實現關聯邏輯。

測試與部署

測試機制

Grails 內建測試支援,基於 Groovy Testing 簡化 JUnit 編寫。分為 Unit Test(獨立測試)與 Integration Test(啟動完整框架環境),分別以 grails create-unit-test、grails create-integration-test 生成測試類。執行 grails test-app 即可按序運行所有測試並產出 HTML 報告。

部署至 Tomcat 6

Grails 文檔雖說明可部署於多數 Java 應用伺服器,但細節較缺。Feedlr 採用 Tomcat 6。打包命令:grails prod war feedlr.war,prod 指定使用 Config.groovy 中生產環境配置(含資料源與環境變數)。若需應用跑在 URL 根路徑,可命名為 ROOT.war。複製 WAR 至 Tomcat 應用目錄並啟動即可。

效能調校重點在記憶體優化。Feedlr 運行於 540MB 記憶體的 VPS,早期 340MB 配置因解析大量 Feed 導致 JVM 效能低下,經優化後穩定運行。詳細優化經驗可參考筆者部落格文章。

實際開發中遇到的挑戰

開發環境不夠成熟

早期於 Eclipse + Groovy 插件開發,但插件支援有限,缺乏 Grails 與 GSP 語法支援。雖 IntelliJ IDEA 對 Groovy/Grails 支援最完整但需付費,NetBeans 開源支援較早期 Eclipse 為佳。好在 Groovy 開發效率高,較弱 IDE 亦能勝任。

Grails 本身尚不成熟

開發過程遇到若干 Bug,甚至導致功能無法運行。解決途徑:Grails 郵件列表求助、官方 JIRA 提交 Bug、自行下載原始碼調試修補。Feedlr 開發中提交過多個補丁,已併入 Grails 1.0。建議開發者積極回報 Bug 與貢獻補丁,共建開源社群。

總結與展望

除測試代碼外,Feedlr 代碼規模約 1.9 KLOC,卻實現全文檢索、Feed 生成、標籤、OpenID 整合等完整 Web 2.0 功能,充分展現 Grails 減輕編碼負擔、避免傳統 JEE 繁瑣的威力。Grails 是否為 JEE 世界的聖杯?將於系列下篇深入分析。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved