2017-03-21 82 views
0

我在我的項目中使用Akka並在我的MainActor類中拉取配置值。我希望能夠在另一個文件中使用commit,version,authortag以構建avro響應,但我不能僅僅簡單地將MainActor作爲我的Avro響應接口的父類。有沒有解決方法?從其他類的MainActor類使用配置值

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

創建另一個特點定義的值,它與你的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") 
} 
0

我覺得你真正需要的是一個Akka Extension,使您能夠以一種優雅的方式增加新的功能,如自定義配置,您阿卡系統。這樣,您就可以訪問演員系統中所有演員的配置值。作爲一個例子,看看這個不錯的blog post

至於你的例子中的其他類,你應該將它們作爲參數傳遞 - 它應該關心檢索和解析配置本身。