2014-01-19 104 views
1

我想通過構建一個生動的twitter流應用程序開始玩遊戲框架。雖然我感到非常困惑,但花了幾天的時間試圖弄清楚這一點,但我似乎無法得到它......希望這裏的某個人不會介意指引我走向正確的方向。twitter4j流與播放框架。

有幾個問題。

1)實際的TwitterStreamFactory實例,這會去哪裏?這是模型的一部分,還是控制器?

2)Websockets,comet,SSE?什麼是最有效的方式 - 對於來自流的每個狀態 - 處理併發送到瀏覽器。

3)和StatusListener。每次我嘗試在eclipse中創建它時,它都會告訴我添加未實現的方法..但是我已經實現了它們。它不會很好地發揮。

3對我來說是個大問題,因爲我無法讓它在任何地方運行。該代碼適用於tomcat服務器,但顯然與使用遊戲完全不同。任何關於我應該在哪裏寫代碼的Twitter流部分的建議?

謝謝你們..這些問題可能被認爲是愚蠢的,但我真的真的在這裏發飆。

回答

2

我之前做過類似的事情,我使用websocket將更新推送到瀏覽器,並使用Akka actors來處理狀態監聽器。控制器然後可以從演員 請求流(枚舉器)並將其作爲websocket返回。

2)的WebSocket是最有效的,但與舊的瀏覽器不兼容,如果您需要更好的瀏覽器兼容性,然後用彗星

我已經修改了代碼來顯示一個很簡單的例子

控制器:

object Application extends Controller { 

    implicit val timeout = Timeout(1 second) 

    val cb = new ConfigurationBuilder() 
    cb.setDebugEnabled(true) 
    .setOAuthConsumerKey("") 
    .setOAuthConsumerSecret("") 
    .setOAuthAccessToken("") 
    .setOAuthAccessTokenSecret("") 

    val twitterListener = Akka.system.actorOf(TwitterListener.props(cb.build())) 

    def join = WebSocket.async[JsValue] { request => 
    (twitterListener ? RequestStream()).mapTo[Connected].map { 
     case Connected(stream) => (Iteratee.ignore, stream) 
    } 
    } 
} 

演員:

object TwitterListener { 
    case class RequestStream() 
    case class Connected(numerator: Enumerator[JsValue]) 
    def props(conf: Configuration) = Props(new TwitterListener(conf)) 
} 

/** 
* Twitter Stream Listener 
* 
* @param config Twitter4j Configuration 
*/ 
class TwitterListener(config: Configuration) extends Actor { 

    import TwitterListener._ 

    val listener = new StatusListener() { 

    val (enum, channel) = Concurrent.broadcast[JsValue] 

    def onStatus(status: Status) { 
     channel.push(Json.obj(
     "msg" -> status.getText, 
     "user" -> status.getUser.getName, 
     "timestamp" -> DateTime.now.toString("yyyy-MM-dd HH:mm:ss") 
    )) 
    } 

    def onDeletionNotice(statusDeletionNotice: StatusDeletionNotice) { 

    } 

    def onTrackLimitationNotice(numberOfLimitedStatuses: Int) { 

    } 

    def onException(ex: Exception) { 
     ex.printStackTrace() 
    } 

    def onScrubGeo(userId: Long, upToStatusId: Long) = { 

    } 

    def onStallWarning(warning: StallWarning) = { 

    } 
    } 

    override def preStart() = { 
    val query = new FilterQuery(0, Array(), Array("birthday")) 
    val twitterStream = new TwitterStreamFactory(config).getInstance 
    twitterStream.addListener(listener) 
    twitterStream.filter(query) 
    } 


    def receive = { 
    case RequestStream() => sender ! Connected(listener.enum) 
    } 

} 
0

我目前正在使用Twitter4j構建自己的遊戲應用程序。 回答您的問題:

  1. 我認爲這將是一個模型,或者你可以爲此創建一個新包。控制器更多的是來自客戶端的請求。

  2. 最有效的方法是使用play的Concurrent.broadcast模型來傳輸Status。要將它們發送到瀏覽器,這取決於您想要的兼容性,但我會推薦Websockets。

  3. 當你用play命令編譯時,它說什麼?

如果您需要一個例子,你可以檢查我的GitHub庫:https://github.com/vdebergue/political-feather,尤其是:actors.TwitterStream.scala