いわゆるマイクロサービス構成向けの Java Web フレームワークSparkを試す。Apache Spark ではない。
今回作ったツールは指定したファイルをダウンロードするというだけのもの。
想定している利用状況は、常設のWebサーバーがないとか有っても自由にファイルを置くことができないといった状況で一時的にでもWebサーバー経由でファイルをダウンロードする動きを実現したい場合。
自分の場合は自作の Vagrant box をダウンロードするために使っている。
今回のツールを使うことで必要な間だけ稼働するWebサーバーを用意できることになる。
同じ目的のツールを Dropwizard を使って一度作っているのだけれど Spark Framework で作るとどうなるのだろうということで試してみた。
その結果、コーディング量が破壊的なまでに少ないツールとなった。
利用目的が目的だけにエラーチェックなどは特に入れていないせいでもある。
ファイルの有無くらいはチェックすべきかもしれないが。
コマンドラインまたは設定ファイルを使うことでポートやファイルを読み出すフォルダを変更できるようにすることを考えているが、適切なライブラリを使えばコード量も大して増えないと思う。
2014/02/04 コード変更
ドキュメントはよく読むものだ。
自分がやろうと思っていることをもっと簡単に記述できることがわかったのでコードを修正。
配布ファイルを1ファイルに固めるアプローチのフレームワークだと静的ファイルはクラスパスに含めるものと思い込んでしまっていて、自前でファイルを送り返す処理を書いていた。ところが Spark では外部フォルダからファイルを読み出す手段が標準で用意されていた。
この例だとカレントディレクトリに public/download/ というディレクトリを用意してその中に対象ファイルを置いておけばよい。
get()メソッドが残っているのは少なくとも一つはrouteを設定しないとサーバーが開始しないため。
ちなみにget()メソッドを用意しておかないとプログラムは即時終了する。
2016/11/30
久々に使うことになったことにあわせてフレームワークのバージョンを上げたところ以前と同様には動かない。
調べたところexternal static fileのパス指定ルールが変更になっていたようだ。
コードを修正。
import java.nio.file.Path;
import java.nio.file.Paths;
import static spark.Spark.get;
import static spark.Spark.staticFiles;
public class JunkServer {
public static void main(String[] args) {
Path path = Paths.get("public");
staticFiles.externalLocation(path.toAbsolutePath().toString());
get("/", (request, response) -> "" );
}
}
アプリケーション起動後に次のようなURLでファイルをダウンロードできる。
http://localhost:4567/download/centos66-x86_64-ja.box
Gradleで設定する依存関係は以下の通り。
dependencies {
compile 'com.sparkjava:spark-core:2.5.3'
}