Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

プロジェクトをつくります。

Code Block
$ mkdir finagle-app
$ cd finagle-app

Finagleのライブラリをbuild.sbtに追加します。

Code Block
titlebuilt.sbt
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)