2014-12-30 6 views
0

저는 Akka/Play/Scala 등을 사용하여 증권 거래소의 대규모 에이전트 기반/다중 에이전트 모델을 구축하고 있으며, 애플리케이션을 구성하는 방법을 이해하는 데 어려움을 겪고 있습니다. I는 DoubleAuctionMarketBasicMatchingEngine 주입 위에typesafe Config 및 HOCON을 사용하여 액터 동작 구성하기

class Exchange extends Actor { 

    val orderRoutingLogic = new OrderRoutingLogic() 

    val router = { 

    val marketsForSecurities = securities.foreach { security => 

     val marketForSecurity = context.actorOf(Props[DoubleAuctionMarket](
     new DoubleAuctionMarket(security) with BasicMatchingEngine), security.name 
    ) 
     orderRoutingLogic.addMarket(security, marketForSecurity) 

    } 
    Router(orderRoutingLogic) 

    } 

니펫 : 이하 I 얼굴 문제 유형의 일례를 도시 한 코드의 단편이다. 그러나 나는 여러 가지 다른 엔진을 작성했으며 응용 프로그램 구성 파일에 DoubleAuctionMarket에 삽입 된 일치하는 엔진의 유형을 구성 할 수 있기를 원합니다.

이 수준의 응용 프로그램 구성은 typesafe 구성 및 HOCON 구성 파일을 사용하여 수행 할 수 있습니까?

답변

0

흥미로운 사례입니다. 내가 맞다면, MatchingEngine 형식으로 지정되어있는 Market 액터 믹싱을 구성에 설정 하시겠습니까?

일부 설명 : 단순히 동적 유형으로 혼합 할 수 없습니다. 제 말은 MatchingEngine 타입을 config로 옮기면 config가 파싱 될 때만 런타임에 알 수 있습니다. 그 때 new DoubleAuctionMarket(security) with ???SomeClassInstance???을 인스턴스화 할 수 없습니다. 하지만 어쩌면 상속을 집계로 대체 할 수 있습니다. 어쩌면 MatchingEngine의 인스턴스가 매개 변수로 Market에 전달 될 수 있습니까?

이제 config에서 MatchingEngine의 인스턴스를 얻는 방법은 무엇입니까? 즉, Typesafe Config에는 FQCN 속성에 대한 구문 분석기가 없지만 리플렉션을 사용하여 직접 수행하는 것은 어렵지 않습니다. 이 기술은 Akka의 많은 장소에서 사용됩니다. 먼저 here을보십시오. provider 속성은 fqcn 문자열로 설정되며 다른 구성에서는 다른 제공자 (예 : RemoteActorRefProvider)로 변경할 수 있습니다. 이제 Provider 인스턴스를 얻기 위해 처리 방법을 살펴보십시오. 먼저 문자열 here으로 읽는 중입니다. 그런 다음 ProviderClass은 실제 (런타임) 제공자 here을 인스턴스화하는 데 사용됩니다. DynamicAccess은 재귀 호출을 돕는 유틸리티입니다. context.system을 통해 공개적으로 액세스 할 수는 없지만 일부만 가져 오거나 인스턴스를 생성하면 큰 문제는 아닌 것 같습니다.

일부 수정으로, 당신의 코드를 볼 수 있습니다 akka docs의 권장 Preactices에 명시된 바와 같이

class Exchange extends Actor { 

    val orderRoutingLogic = new OrderRoutingLogic() 
    val matchingEngineClass = context.system.settings.config.getString("stocks.matching-engine") 
    val matchingEngine = DynamicAccess.createInstance[MatchingEngine](matchingEngineClass) 

    val router = { 

    val marketsForSecurities = securities.foreach { security => 

     val marketForSecurity = context.actorOf(DoubleAuctionMarket.props(security, matchingEngine)) 
     orderRoutingLogic.addMarket(security, marketForSecurity) 

    } 
    Router(orderRoutingLogic) 

    } 

나는 DoubleAuctionMarket의 동반자 개체에 소품을 이동했습니다. Props(new Actor())의 사용은 위험한 습관입니다.

+0

감사합니다. 이것은 내가하고 싶은 것에 매우 가깝게 보입니다. 내 질문이 다소 엉성한 것일 수 있습니다. 내가 원하는 것은 "큰 모델/응용 프로그램에 대한 종속성 주입을 관리하는 방법"이란 제목 아래 놓을 수 있습니다. 이와 관련하여 도움을 줄 수있는 도서관 (예 : Guice, Spring, Play)이있는 것으로 보입니다. 당신의 대답도 그 방향의 한 걸음처럼 보입니다. 나는 그것에 대해 생각하고 다시 당신에게 돌아갈 것입니다. – davidrpugh