使用其他类

时间:2017-03-21 19:13:38

标签: scala akka actor

我在我的项目中使用Akka并在我的MainActor课程中提取配置值。我希望能够在另一个文件中使用commitversionauthor tag来构建avro响应,但我不能简单地使MainActor成为我的Avro响应界面的父类。有解决方法吗?

我的MainActor班级

class MainActor extends Actor with ActorLogging with ConfigComponent with ExecutionContextComponent with DatabaseComponent with DefaultCustomerProfiles {

  override lazy val config: Config = context.system.settings.config

  override implicit lazy val executionContext: ExecutionContext = context.dispatcher

  override val db: Database = Database.fromConfig(config.getConfig("com.ojolabs.customer-profile.database"))

  private val avroServer = context.watch {
    val binding = ReflectiveBinding[CustomerService.Async](customerProfileManager)

    val host = config.getString("com.ojolabs.customer-profile.avro.bindAddress")
    val port = config.getInt("com.ojolabs.customer-profile.avro.port")

    context.actorOf(AvroServer.socketServer(binding, host, port))
  }

  val commit = config.getString("com.ojolabs.customer-profile.version.commit")
  val author = config.getString("com.ojolabs.customer-profile.version.author")
  val tag =  config.getString("com.ojolabs.customer-profile.version.tag")
  val buildId = config.getString("com.ojolabs.customer-profile.version.buildId")

  override def postStop(): Unit = {
    db.close()
    super.postStop()
  }

  //This toplevel actor does nothing by default
  override def receive: Receive = Actor.emptyBehavior

}

我想把值拉到

trait DefaultCustomerProfiles extends CustomerProfilesComponent {
  self: DatabaseComponent with ExecutionContextComponent =>

  lazy val customerProfileManager = new CustomerService.Async {

    import db.api._

    override def customerById(id: String): Future[AvroCustomer] = {
      db.run(Customers.byId(UUID.fromString(id)).result.headOption)
        .map(_.map(AvroConverters.toAvroCustomer).orNull)
    }

    override def customerByPhone(phoneNumber: String): Future[AvroCustomer] = {
      db.run(Customers.byPhoneNumber(phoneNumber).result.headOption)
        .map(_.map(AvroConverters.toAvroCustomer).orNull)
    }

    override def findOrCreate(phoneNumber: String, creationReason: String): Future[AvroCustomer] =  {
      db.run(Customers.findOrCreate(phoneNumber, creationReason)).map(AvroConverters.toAvroCustomer)
    }

    override def createEvent(customerId: String, eventType: String, version: Double, data: String, metadata: String): Future[AvroCustomerEvent] = {

      val action = CustomerEvents.create(
        UUID.fromString(customerId),
        eventType,
        Json.parse(data),
        version,
        Json.parse(metadata)
      )

      db.run(action).map(AvroConverters.toAvroEvent)
    }

    override def getVersion() : Version = {


    }
}

2 个答案:

答案 0 :(得分:2)

创建另一个定义值的特征,并将其与MainActor和DefaultCustomerProfiles特征混合。

trait AnvroConfig {
   self: ConfigComponent

      val commit = config.getString("com.ojolabs.customer-profile.version.commit")
      val author = config.getString("com.ojolabs.customer-profile.version.author")
      val tag =  config.getString("com.ojolabs.customer-profile.version.tag")
      val buildId = config.getString("com.ojolabs.customer-profile.version.buildId")
}

答案 1 :(得分:0)

我认为您真正需要的是Akka Extension,它可以让您以优雅的方式向Akka系统添加自定义配置等功能。这样,您就可以从actor系统中访问所有actor中的那些配置值。举个例子,看看这个不错的blog post

对于您示例中的其他类,您应该将它们作为参数传递 - 它应该与检索和解析配置本身有关。