在Actor中创建ActorSystem的正确方法

时间:2014-04-17 03:44:41

标签: scala akka rediscala

我正在使用第三方库(rediscala)访问我自己的Actor中的Redis数据库。以下是我目前正在做的一个例子。它是否正确 ?以下代码是否存在任何潜在问题,因为我在我的actor中创建了一个akkaSystem。如果SimpleRedisClientActor崩溃,那么我需要重新启动SimpleRedisClientActor,这将创建另一个Actor系统。我应该覆盖preStartpostStop吗?

import akka.actor.{Props, Actor, ActorLogging}
import redis.RedisClient

import scala.util.{Failure, Success}
import scala.concurrent.ExecutionContext.Implicits.global

class SimpleRedisClientActor extends Actor with ActorLogging {

  implicit val akkaSystem = akka.actor.ActorSystem()
  val redis = RedisClient()

  def receive: Receive = {

    case PingRedis => {
      val futurePong = redis.ping()
      futurePong.onComplete{
        case Success(s) =>  log.info("Redis replied back with a pong")
        case Failure(f) =>  log.info("Something was wrong ...")
      }
    }
  }
}

object RedisActorDemo extends App {

  implicit val akkaSystem = akka.actor.ActorSystem()
  val simpleActor = akkaSystem.actorOf(Props(classOf[SimpleRedisClientActor]))
  simpleActor ! PingRedis
}

object PingRedis

1 个答案:

答案 0 :(得分:3)

不是个好主意。 ActorSystem为actor提供运行时支持,因此您需要一个ActorSystem来创建一个actor,而不是相反。此外,启动一个ActorSystem需要大约500ms,所以你不会创建很多 - 他们是非常重量级的。相比之下,Actors非常轻巧。每个网络节点应该只有一个ActorSystem。