Finagle 2.9.1 Getting Started (ハッカソン一人反省会)

2012年5月19日に Twitter Japan でやんわりと行われてた Finagle ハッカソン の一人反省会も兼ねて Finagle Getting Started などを書きます。

Finagle セットアップ

ハッカソンWindows 7 上で行った sbt による Finagle のセットアップをさくら VPS で再現します (準備していった CentOS on VMWare 環境ではなぜか sbt update が失敗…)。環境は以下のとおり。JavaScala は予め導入しておいてください。

OS CentOS 6.2 final
Java Java 1.7.0_04
Scala Scala 2.9.2

Maven や ivy で色々と構成している環境ではライブラリの競合などで後々引っかかるかもしれない。

開発用のディレクトリを作成して sbt の JAR をダウンロード。Finagle で使用する sbt のバージョンについてはみなさんがもにゃもにゃ言っていたがよく覚えていないので 0.11 を使用します。

torao@www9361ue$ mkdir finagle
torao@www9361ue$ cd finagle
torao@www9361ue$ wget "http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar"
 --2012-05-21 17:41:25--  http://typesafe.artifactoryonline.com/typesafe/ivy-releases/org.scala-tools.sbt/sbt-launch/0.11.2/sbt-launch.jar
typesafe.artifactoryonline.com をDNSに問いあわせています... 107.20.116.31
…
2012-05-21 17:41:30 (386 KB/s) - `sbt-launch.jar' へ保存完了 [1041753/1041753]

Finagle に必要な環境を構築するため水島さんのスライドを参考に build.sbt を作成します。libraryDependencies 最後のエントリはハッカソンMySQL と連携させるためのもので Finagle の実行に必須ではありません。

torao@www9361ue$ vim build.sbt
# Twitter's Maven Repository
resolvers += "twitter-repo" at "http://maven.twttr.com"

libraryDependencies ++= Seq(
  "com.twitter" % "finagle-core_2.9.1" % "4.0.2",
  "com.twitter" % "finagle-http_2.9.1" % "4.0.2",
  "com.twitter" % "finagle-stream_2.9.1" % "4.0.2",
  "mysql" % "mysql-connector-java" % "5.1.18" % "runtime"
)

もうね、このへんで泣きそうになりながらみんなで取ったピザ食ってたわ。

sbt の起動スクリプトを作成します。Scala のライブラリを参照していたのでシステムプロパティ scala.homeScalaディレクトリを指定します。

torao@www9361ue$ vim sbt
#!/bin/sh
java -Xmx512M -Dscala.home="~/lib/scala-2.9.2" -jar `dirname $0`/sbt-launch.jar "$@"
torao@www9361ue$ chmod 755 sbt

sbt を起動して Finagle のライブラリをダウンロード。

torao@www9361ue$ ./sbt update test
Getting net.java.dev.jna jna 3.2.3 ...
downloading http://repo1.maven.org/maven2/net/java/dev/jna/jna/3.2.3/jna-3.2.3.jar ...
        [SUCCESSFUL ] net.java.dev.jna#jna;3.2.3!jna.jar (3011ms)
retrieving :: org.scala-tools.sbt#boot-app
… [info] Set current project to default-f280ef (in build file:/home/torao/finagle/) [success] Total time: 0 s, completed 2012/05/21 18:02:23 [info] No tests to run for test:test [success] Total time: 1 s, completed 2012/05/21 18:02:23

テストはないんだっけ? まあ良いか。
ちなみにハッカソンではこの時点で PM1:00 を回っていた。

hello, world を作る

次に簡単なコードを使用して Finagle の起動を確認するところまで。sbt は開発ディレクトリの . (ベースディレクトリ)、src/main/java, src/main/scalasrc/test/java, src/test/scala を暗黙的にソースディレクトリと認識してくれるらしいので src/main/scala/org/koiroha/finaglehackathon/HelloWorld.scala に以下のようなコードを作成。

torao@www9361ue$ mkdir -p src/main/scala/org/koiroha/finaglehackathon/
torao@www9361ue$ vim src/main/scala/org/koiroha/finaglehackathon/HelloWorld.scala
package org.koiroha.finaglehackathon
import java.net.InetSocketAddress
import com.twitter.finagle.builder.ServerBuilder
import com.twitter.finagle.http._
import com.twitter.util.Future
import com.twitter.finagle.Service

object HelloWorld {
  def main(args:Array[String]){
    val service = new Service[Request, Response]{
      def apply(request:Request) = {
        val response = Response()
        response.contentType = "text/plain; charset=UTF-8"
        response.withWriter{ out =>
          out.write("hello, world")
        }
        Future.value(response)
      }
    }
    val server = ServerBuilder()
      .codec(RichHttp[Request](Http()))
      .bindTo(new InetSocketAddress(8080))
      .name("Finagle Hack-a-thon")
      .build(service)
  }
}

sbt run を実行すると上記で作成したソースをコンパイルし main() を実行してくれる。

torao@www9361ue$ ./sbt run
[info] Set current project to default-f280ef (in build file:/home/torao/finagle/)
[info] Compiling 1 Scala source to /home/torao/finagle/target/scala-2.9.1/classes...
[info] Running org.koiroha.finaglehackathon.HelloWorld

ブラウザからポート 8080 にアクセスし hello, world と表示されれば完了です。

torao@www9361ue$ lynx http://localhost:8080
hello, world

この時点でタイムリミットまで 1 時間半! 残りはありふれた Java の設計を Scala の文法で書いたようなつまらないコードなので割愛します。一応反省会としては環境構築と sbt に時間が食われたのでもう少し sbt に慣れておけば良かったかなと (´・ω・`)

あと Twitter Japan はサイコーでした。 #ステマ