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