0

我正在使用 Akka/Play/Scala 等构建一个大型的基于代理/多代理的证券交易所模型,我正在努力了解如何配置我的应用程序。下面是一段代码,说明了我面临的问题类型的一个示例:

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)

  }

在上面的代码片段中,我将 aBasicMatchingEngine注入到DoubleAuctionMarket. 但是,我已经编写了许多不同的匹配引擎,并且我希望能够配置注入到DoubleAuctionMarket应用程序配置文件中的匹配引擎的类型。

这种级别的应用程序配置可以使用 typesafe Config 和 HOCON 配置文件来完成吗?

4

1 回答 1

0

有趣的案例。如果我理解正确,您想以配置中指定的Market某种类型配置演员混合MatchingEngine

一些澄清:你不能简单地混合动态类型。我的意思是,如果您将MatchingEngine类型移动到配置 - 只有在运行时解析配置时才会知道它。那时你将无法实例化new DoubleAuctionMarket(security) with ???SomeClassInstance???. 但也许你可以用聚合代替继承。也许一个实例MatchingEngine可以作为参数传递给市场?

现在,如何从配置中获取实例MatchingEngine?简而言之 - Typesafe Config 没有FQCN属性的解析器,但使用反射自己做并不难。这种技术在 Akka 的许多地方都有使用。先看这里provider属性设置为 fqcn 字符串,可以RemoteActorRefProvider在其他配置中更改为其他提供程序(即)。现在看看它是如何处理来获取Provider实例的。首先,它只是在这里被读取为字符串。然后ProviderClass用于在此处实例化实际(运行时)提供程序。DynamicAccess是一个帮助进行反身调用的实用程序。它不能通过 context.system 公开访问,但只需获取一部分或实例化自己,我认为这不是一个大问题。

通过一些修改,您的代码可能看起来:

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)

  }

如Akka docs的推荐做法中所述,我已将道具移至 DoubleAuctionMarket 的伴随对象。的使用Props(new Actor())是危险的做法。

于 2015-01-06T14:56:33.847 回答