こちらで紹介された、Undertowが面白そうだったので、久々にClojureで書くことを兼ねて遊んでみました。
WildFly の Web 基盤、Undertow の紹介
http://emamotor.blogspot.jp/2013/12/introduction-undertow.html
Undertow
http://undertow.io/
紹介されていた内容を、ScalaとClojureで、かつスクリプト形式で移植。
Scala(scalas)
Scalaは、scalasを使ってやります。scalasって何?な方は、こちらへ。
http://d.hatena.ne.jp/Kazuhira/20130425/1366901339
書いたコードは、こちら。
HelloWorldServer.scala
#!/usr/bin/env scalas /*** scalaVersion := "2.10.3" libraryDependencies += "io.undertow" % "undertow-core" % "1.0.0.Beta27" */ import io.undertow.Undertow import io.undertow.server.{HttpHandler, HttpServerExchange} import io.undertow.util.Headers val server = Undertow .builder .addListener(8080, "localhost") .setHandler(new HttpHandler { @throws(classOf[Exception]) override def handleRequest(exchange: HttpServerExchange): Unit = { exchange.getResponseHeaders.put(Headers.CONTENT_TYPE, "text/plain") exchange.getResponseSender.send("Hello World") } }) .build server.start() println("HelloWorldServer is running!")
実行するには、スクリプトに実行権限を付与してください。
$ chmod a+x HelloWorldServer.scala
実行。
$ ./HelloWorldServer.scala
ちなみに、相変わらずこのscalasの実行形態は重たいです。
Clojure(lein-exec)
Clojureは、lein-execプラグインで。lein-execプラグインが何?って方は、こちらへ。
http://d.hatena.ne.jp/Kazuhira/20130820/1377006828
hello-world-server.clj
(require '[leiningen.exec :as exec]) (exec/deps '[[io.undertow/undertow-core "1.0.0.Beta27"]]) (ns hello-world-server (:import (io.undertow Undertow) (io.undertow.server HttpHandler HttpServerExchange) (io.undertow.util Headers))) (let [^Undertow server (-> (Undertow/builder) (.addListener 8080 "localhost") (.setHandler (proxy [HttpHandler] [] (handleRequest [^HttpServerExchange exchange] (-> (. exchange getResponseHeaders) (.put (Headers/CONTENT_TYPE) "text/plain")) (-> (. exchange getResponseSender) (.send "Hello World"))))) (.build))] (. server start) (println "HelloWorldServer is running!") (read-line))
Clojureでやると、プログラムが終わってしまうのでread-lineで止めました…。Enterを打つと、終了します。
こちらは、実行権限の付与はいりません。実行。
$ lein exec hello-world-server.clj
$ curl localhost:8080
Hello World
という確認結果になります。…そりゃあそうですが。
ホントは、以下にあるServletのサンプルも書こうと思ったのですけど。
scalasでやると、トップレベルのClassが作れないのでインナークラスのデフォルトコンストラクタができなくて動かず、Clojureのスクリプト型式までは動かすところまでちょっと辿り着かなかったので、ここまでで。
こういうライブラリというかサーバフレームワークみたいなものも、いろいろ遊んでみたいんですけどねぇ。ちょっと深堀りするところまでは、今は手が回りそうにないかなぁ…。