プロジェクトをつくります。
Code Block |
---|
$ mkdir finagle-app $ cd finagle-app |
Finagleのライブラリをbuild.sbtに追加します。
Code Block | ||
---|---|---|
| ||
libraryDependencies += "com.twitter" %% "finagle-core" % "6.10.0"
libraryDependencies += "com.twitter" %% "finagle-http" % "6.10.0" |
sbt consoleを起動します。
Code Block |
---|
$ sbt console |
以下のコードを実行して、ブラウザでlocalhost:10000にアクセスします。
Code Block |
---|
import java.net.SocketAddress
import java.net.InetSocketAddress
import org.jboss.netty.handler.codec.http.HttpRequest
import org.jboss.netty.handler.codec.http.HttpResponse
import org.jboss.netty.handler.codec.http.DefaultHttpResponse
import com.twitter.finagle.Service
import com.twitter.finagle.builder.Server
import com.twitter.finagle.builder.ServerBuilder
import com.twitter.finagle.http.Http
import org.jboss.netty.buffer.ChannelBuffers.copiedBuffer
import org.jboss.netty.handler.codec.http._
import org.jboss.netty.handler.codec.http.HttpResponseStatus._
import org.jboss.netty.handler.codec.http.HttpVersion.HTTP_1_1
import org.jboss.netty.util.CharsetUtil.UTF_8
import com.twitter.util.Future
val service: Service[HttpRequest, HttpResponse] = new Service[HttpRequest, HttpResponse] {
def apply(request: HttpRequest) = Future {
val response = new DefaultHttpResponse(HTTP_1_1, OK)
val finagle = "Finagle"
response.setContent(copiedBuffer(s"Hello ${finagle}!", UTF_8))
response
}
}
val address: SocketAddress = new InetSocketAddress(10000)
val server: Server = ServerBuilder()
.codec(Http())
.bindTo(address)
.name("HttpServer")
.build(service)
}
|
new クラス名でクラスのインスタンスを生成します。
そして、new クラス名 { def メソッド名(引数) = 式 }で匿名クラスのインスタンスを生成します。
したがって、以下でServiceクラスにapplyというメソッドを追加した匿名クラスのインスタンスを生成します。
Code Block |
---|
new Service[HttpRequest, HttpResponse] {
def apply(request: HttpRequest) = 式
} |
{ }のブロック中に式を一つ以上を書くと、ブロックが評価されます。ブロックが評価されると、全ての式が上から順に評価されます。ブロックの評価結果というものもあって、それはブロックの最後の式の結果です。
したがって、以下は4の式が評価されて、最後のresponseがブロックの結果になります。
Code Block |
---|
{ val response = new DefaultHttpResponse(HTTP_1_1, OK) val finagle = "Finagle" response.setContent(copiedBuffer(s"Hello ${finagle}!", UTF_8)) response } |
関数 { }で、関数に引数としてブロックを渡します。
したがって、以下はFutureという関数にブロックを渡しています。
Code Block |
---|
Future { // 略 } |
s"${式}"で文字列リテラルに式の評価結果を埋め込みます。
したがって、以下のように書くと"Hello Finagle!"という文字列になります。
Code Block |
---|
val finagle = "Finagle"
s"Hello ${finagle}!" |
オブジェクト.名前でメソッド呼び出しになります。
さらに.名前を続けると、先のメソッド呼び出しの結果に対してさらにメソッド呼び出しをすることができます。
したがって、以下のコードではServerBuilder関数の結果に対してcodecメソッドを呼び出して、その結果に対してbindToメソッドを呼び出して・・ということになります。
Code Block |
---|
val server: Server = ServerBuilder()
.codec(Http())
.bindTo(address)
.name("HttpServer")
.build(service) |