How is Ostrich used for configuration?

孤街醉人 提交于 2019-12-02 20:46:00

I'd like to know the official answer as well, but nobody answered so I decided to poke around. Sorry if this answer isn't quite comprehensive.

The best example I found was in com.twitter.ostrich.admin.RuntimeEnvironment, especially if you look mainly at loadConfig.

Say you want to configure an instance of class T. The basic idea is as follows:

  • Get a java.io.File that contains Scala source code that evaluates to a com.twitter.util.Config[T].
  • In order to be a valid Config[T] you'll need to have a def apply(): T method. To keep the implementation details out of the config file, you'll want to define a class in your project that extends Config[T]. You can also use this class to define default/required fields.
  • Instantiate a new com.twitter.util.Eval instance, and call apply(file) to get a Config[T] instance.
  • Call config.validate() to throw the proper exceptions for malformed config files.
  • Call config.apply() to get your fully configured instance of T.

Here is a simple example, where I configure a new WidgetService:

class WidgetService(val port: Int)

class WidgetConfig extends com.twitter.util.Config[WidgetService] {
  var port = required[Int]
  def apply(): WidgetService = {
    new WidgetService(port)
  }
}

object MyApp extends App {
  val configFile = new java.io.File("mywidget_config.scala")
  val eval = new com.twitter.util.Eval
  val config = eval[com.twitter.util.Config[WidgetService]](configFile)
  config.validate()
  val widgetService = config()
  println(widgetService.port)
}

And here is mywidget_config.scala:

new WidgetConfig {
  port = 8000
}

Note: you may have to make modifications if you put this in a package. I did everything in the default package for brevity.

To get the dependencies to work, I added this to my SBT config:

libraryDependencies += "com.twitter" % "util" % "1.10.1"
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!