doc/src/sphinx/code/AdvancedServer.scala (28 lines of code) (raw):
import com.twitter.conversions.DurationOps._
import com.twitter.finagle.http.{HttpMuxer, Request, Response, Status}
import com.twitter.finagle.Service
import com.twitter.logging.Formatter
import com.twitter.server.TwitterServer
import com.twitter.util.{Await, Future, Time}
import java.net.InetSocketAddress
object AdvancedServer extends TwitterServer {
//#flag
val what = flag("what", "hello", "String to return")
//#flag
//#complex_flag
val addr = flag("bind", new InetSocketAddress(0), "Bind address")
val durations = flag("alarms", (1.second, 5.second), "2 alarm durations")
//#complex_flag
//#stats
val counter = statsReceiver.counter("requests_counter")
//#stats
//#fail_fast
override def failfastOnFlagsNotParsed: Boolean = true
//#fail_fast
val service = new Service[Request, Response] {
def apply(request: Request) = {
//#log_usage
debug("Received a request at " + Time.now)
//#log_usage
//#stats_usage
counter.incr()
//#stats_usage
val response = Response(request.version, Status.Ok)
response.contentString = what() + "\n"
Future.value(response)
}
}
def main(): Unit = {
// We could create a new http server but in this case we use the
// one already started for /admin/* endpoints.
// The `TwitterServer` trait exposes an `adminHttpServer` that serve all routes
// registered in the HttpMuxer object, we just have to add our own.
//#registering_http_service
HttpMuxer.addHandler("/echo", service)
HttpMuxer.addHandler("/echo/", service)
//#registering_http_service
// And wait on the server
Await.ready(adminHttpServer)
}
}