я использую таймер Акка
я использую потоков Twitter и я пытаюсь получить количество твитов в 5 секунд, вот мой код
case class PerSecond(tweet:Tweet)
case class TweetPerSecondCount(tweet:Tweet)
class TweetPerSecondActor extends Actor with Timers{
var counter=0
def receive: PartialFunction[Any, Unit] = {
case PerSecond(tweet) =>
log.info("Actor TweetPerSecondActor recevied the message PerSecond")
timers.startPeriodicTimer("perSecond", TweetPerSecondCount(tweet), 5.second)
case TweetPerSecondCount(tweet) =>
log.info("Actor TweetPerSecondActor recevied the message TweetPerSecondCount")
log.info("got the tweet {}",getCounter+"in 5 seconds")
case message =>
log.warn("Actor TweetPerSecondActor: Unhandled message received : {}", message)
unhandled(message)
}
}
в контроллере игровой платформы. Действие Я беру объекты твитов из потока твиттера (непрерывный поток, не наклоняя его)
class Mycontroller extends Controller {
val tweetPerSecondActor = system.actorOf......//create actor
def tweetAveragePerSecond = Action {
log.debug("in the action tweetAveragePerSecond")
def getTweet: PartialFunction[StreamingMessage, Unit] = {
case tweet: Tweet =>
val future = ask(tweetPerSecondActor, PerSecond(tweet))
}
val streaming: Future[TwitterStream] = handleTwitterStreamClient.getStreamingCLient.sampleStatuses(stall_warnings = true)(getTweet)
Ok("tweet average per second")
}
}
, когда я нажимаю на маршрут, журналы показывают
TweetPerSecondActor INFO - Actor TweetPerSecondActor recevied the message PerSecond
16:42:44.335 28939 [ArteciateActorSystem-akka.actor.default-dispatcher-5] TimerScheduler DEBUG - Cancel timer [perSecond] with generation [758]
16:42:44.335 28939 [ArteciateActorSystem-akka.actor.default-dispatcher-5] TimerScheduler DEBUG - Start timer [perSecond] with generation [759]
6:42:44.335 28939 [TwitterActorSystem-akka.actor.default-dispatcher-6] TweetPerSecondActor INFO - Actor TweetPerSecondActor recevied the message PerSecond
16:42:44.335 28939 [TwitterActorSystem-akka.actor.default-dispatcher-5] TimerScheduler DEBUG - Cancel timer [perSecond] with generation [758]
16:42:44.335 28939 [TwitterActorSystem-akka.actor.default-dispatcher-5] TimerScheduler DEBUG - Start timer [perSecond] with generation [759]
и если я передаю фиктивные строковые значения вместо запуска потока и передачи объекта twitter, таймер работает нормально, как показано ниже: case case PerSecond (tweet: String) case class TweetPerSecondCount (tweet: String)
class TweetPerSecondActor extends Actor with Timers{
var counter=0
def receive: PartialFunction[Any, Unit] = {
case PerSecond(tweet) =>
log.info("Actor TweetPerSecondActor recevied the message PerSecond")
timers.startPeriodicTimer("perSecond", TweetPerSecondCount(tweet), 5.second)
case TweetPerSecondCount(tweet) =>
log.info("Actor TweetPerSecondActor recevied the message TweetPerSecondCount")
log.info("got the tweet {}",getCounter+"in 5 seconds")
case message =>
log.warn("Actor TweetPerSecondActor: Unhandled message received : {}", message)
unhandled(message)
}
}
class Mycontroller extends Controller {
val tweetPerSecondActor = system.actorOf......//create actor
def tweetAveragePerSecond = Action {
log.debug("in the action tweetAveragePerSecond")
val future = ask(tweetPerSecondActor, PerSecond("dummy value"))
Ok("tweet average per second")
}
}