2014年4月24日木曜日

Play FrameworkのAkkaでスケジューラ処理

Play FrameworkのAkkaでスケジューラ処理をさせました。
バージョン
Play Framework 2.2.2

GlobalSettingsを継承して、onStartをoverrideさせることで実現できました。
package common

import akka.actor._
import scala.concurrent.duration._
import play.api._
import play.api.libs.json._
import play.api.libs.concurrent._
import play.api.Play.current
import play.api.libs.concurrent.Execution.Implicits._
import service.TwitterService
import play.Logger
 
object Global extends GlobalSettings {
  
  override def onStart(app: Application){
   val actor = Akka.system.actorOf(Props(new TwitterService), "twitterservice")    
    Akka.system.scheduler.schedule(0.milliseconds, 1.minutes, actor, "tick")
  }  
}
TwitterServiceは↓に載せてあります。twitter4jを使って現在のtrendを取得する処理です。
Akkaに処理を渡す形になるのでActorを継承する必要があります。
Akka.system.scheduler.schedule(0.milliseconds, 1.minutes, actor, "tick")
は起動して0ミリ秒から1分置きにactorを動かして、actorに"tick"を送ります。
package service
 
import twitter4j.Twitter
import twitter4j.TwitterFactory
import twitter4j.Trend
import play.api.libs.concurrent.Akka
import akka.actor._
import akka.actor.Actor._
import org.slf4j.LoggerFactory
import play.Logger
import twitter4j.conf.ConfigurationBuilder
 
class TwitterService extends Actor{
   
  def receive = {
    case i:Int => {
      Logger.error("aa")
      println("aa")
    }
    case msg:String => {
      Logger.error(msg)
      println(msg)
      getTrend(23424856)
    }
    case _ => {
      Logger.error("tetete")
      println("tetete")
      getTrend(23424856)
    }
  }
  
  def getTrend(place:Int):Array[Trend] = {
    
    var twitter = twitterFactory.getInstance()
    var trendsResources = twitter.trends()
    var trends = trendsResources.getPlaceTrends(place)
    
    for(trend:Trend <- trends.getTrends()){
     println(trend.getName())
    }
  }  
}
def receiveにcase文で3つ処理を書きましたが、
"tick"を送っているので、case msg:Stringの処理が実行されます。

application.confのapplication.globalでGlobal.scalaの配置位置を指定できます
# Global object class
# ~~~~~
# Define the Global object class for this application.
# Default to Global in the root package.
# application.global=Global
application.global=common.Global

これでplay runで実行すると、1分置きにtwitterのtrendを取得しに行く処理が動きます。

参考URL
http://www.playframework.com/documentation/2.2.x/ScalaGlobal
http://stackoverflow.com/questions/20924195/play-framework-2-2-scala-onstart-doesnt-work

0 件のコメント:

コメントを投稿