2014-01-19 4 views
1

Я пытаюсь начать работу с картой игр, создав приложение для трансляции в прямом эфире. Я очень смущен, хотя, и потратил несколько дней, пытаясь понять это, но я, похоже, не могу его понять .. надеясь, что кто-то здесь не возражает, указывая на меня в правильном направлении.twitter4j-stream with play framework.

Несколько вопросов.

1) Фактический экземпляр TwitterStreamFactory, где это будет? Является ли эта часть модели или контроллером?

2) Websockets, comet, SSE? Самый эффективный способ - для каждого состояния, которое приходит через поток - обрабатывать и отправлять в браузер.

3) И StatusListener. Каждый раз, когда я пытаюсь создать это в eclipse, он говорит мне добавлять нереализованные методы .. но я их реализовал. Он просто не будет играть красиво.

3 - большая проблема для меня, потому что я не могу заставить ее работать где угодно. Код работает на сервере tomcat, но он явно отличается от игры. Любые советы о том, где я должен писать часть потока твиттера?

Спасибо, ребята .. Эти вопросы, вероятно, считаются глупыми, но я действительно, действительно в колею здесь.

ответ

2

Я сделал что-то подобное некоторое время назад, я использовал веб-порты, чтобы нажимать обновления в браузере и Аккор Акка для обработки слушателя статуса. Затем контроллер может запросить поток (Enumerator) от актера и вернуть его как веб-узел.

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. Наиболее эффективным способом является использование моделей игр Concurrent.broadcast для потоковой передачи Status. Чтобы отправить их в браузер, это зависит от совместимости, которую вы хотите, но я бы рекомендовал Websockets.

  3. Когда вы компилируете команду воспроизведения, что она говорит?

Если вам нужен пример, вы можете проверить мой GitHub репо: https://github.com/vdebergue/political-feather, особенно: actors.TwitterStream.scala