问题
I need a way to configure my scala application. Configgy seemed the way to go in Scala but it is deprecated https://github.com/robey/configgy#readme and now this functionality is in Ostrich.
Is there a code example on how to use Ostrich only for configuration? I'm not interested in collecting the statistics.
回答1:
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 adef apply(): T
method. To keep the implementation details out of the config file, you'll want to define a class in your project that extendsConfig[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 aConfig[T]
instance. - Call
config.validate()
to throw the proper exceptions for malformed config files. - Call
config.apply()
to get your fully configured instance ofT
.
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"
来源:https://stackoverflow.com/questions/6504849/how-is-ostrich-used-for-configuration